PAT 1131 Subway Map

 

题目链接:

https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432

思路:

说多了都是泪,

Dijstra超时,采用dfs

利用map<pair<int,int>,int>,表示两个点和他们中间的地铁线号

每次更新最短路径即可

Dijstra WA Code

#include <iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<cstring>
#define MAX 0x3fffffff
using namespace std;
const int maxn=10005;
vector<int> ed[maxn];
vector<int> path;
int degre[maxn];
int dis[maxn],vis[maxn],num[maxn];
int loc[maxn],tot=0;
int pre[maxn];
map<pair<int,int>,int> mp; 
void dfs(int v,int s,int t){if(v==-1) return;dfs(pre[v],s,t);tot++;path.push_back(v);
}
int main(int argc, char** argv) {int N;scanf("%d",&N);int cnt=0;memset(degre,0,sizeof(degre));for(int i=1;i<=N;i++){int M,start;scanf("%d %d",&M,&start);if(!vis[start]){loc[cnt++]=start;vis[start]=1;}for(int j=2;j<=M;j++){int x2;scanf("%d",&x2);if(!vis[x2]){loc[cnt++]=x2;vis[x2]=1;}ed[start].push_back(x2);ed[x2].push_back(start);mp[make_pair(start,x2)]=i;mp[make_pair(x2,start)]=i;degre[start]++;degre[x2]++;start=x2;}}int query;scanf("%d",&query);while(query--){//清零 int s,t;scanf("%d %d",&s,&t);if(s==t){cout<<0<<endl;continue;}for(int i=0;i<cnt;i++){dis[loc[i]]=MAX;vis[loc[i]]=0;num[loc[i]]=0;pre[loc[i]]=-1;}path.clear();dis[s]=0;tot=0;for(int i=0;i<cnt;i++){//n-1int mindis=MAX,ind=-1;for(int j=0;j<cnt;j++){if(!vis[loc[j]]&&(dis[loc[j]]<mindis)){mindis=dis[loc[j]];ind=j;}}if(ind==-1) break;vis[loc[ind]]=1;int now=loc[ind];for(int j=0;j<ed[now].size();j++){int next=ed[now][j];if(dis[next]>dis[now]+1){dis[next]=dis[now]+1;if(degre[next]>2) num[next]=num[now]+1;else num[next]=max(num[now],num[next]);pre[next]=now;}else if(dis[next]==dis[now]+1&&num[next]>num[now]+1){num[next]=num[now]+1;pre[next]=now; }}}dfs(t,s,t);printf("%d\n",tot-1);int line=0,pre=0;for(int j=1;j<path.size();j++){if(mp[make_pair(path[j-1],path[j])]!=line){if(line!=0) printf("Take Line#%d from %04d to %04d.\n",line,pre,path[j-1]);line=mp[make_pair(path[j],path[j-1])];//先保存前一个时刻的值,等下一个时刻来的时候再做处理 pre=path[j-1];}}printf("Take Line#%d from %04d to %04d.\n",line,pre,path[path.size()-1]);}return 0;
}
View Code

正解:

参考自:https://www.liuchuo.net/archives/3850

#include <iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<cstring>
#define MAX 0x3fffffff
using namespace std;
const int maxn=10005;
vector<int> ed[maxn],path,ans;
int vis[maxn];
map<pair<int,int>,int> mp; 
int s,t;
int minCnt=MAX,minTrans=MAX; 
int trans(const vector<int> &path){int line=0,tmp=0;for(int i=1;i<path.size();i++){if(mp[make_pair(path[i],path[i-1])]!=line) tmp++;line=mp[make_pair(path[i],path[i-1])];}return tmp;
}
void dfs(int v,int cnt){if(v==t){if(cnt<minCnt){minCnt=cnt;minTrans=trans(path);ans=path;}else if(cnt==minCnt&&trans(path)<minTrans){minTrans=trans(path);ans=path;}return; }for(int i=0;i<ed[v].size();i++){if(!vis[ed[v][i]]){vis[ed[v][i]]=1;path.push_back(ed[v][i]);dfs(ed[v][i],cnt+1);vis[ed[v][i]]=0;path.pop_back();}}
}
int main(int argc, char** argv) {int N;scanf("%d",&N);int cnt=0;for(int i=1;i<=N;i++){int M,start;scanf("%d %d",&M,&start);for(int j=2;j<=M;j++){int x2;scanf("%d",&x2);ed[start].push_back(x2);ed[x2].push_back(start);mp[make_pair(start,x2)]=i;mp[make_pair(x2,start)]=i;start=x2;}}int query;scanf("%d",&query);while(query--){//清零 memset(vis,0,sizeof(vis));path.clear();ans.clear();minCnt=MAX,minTrans=MAX;scanf("%d %d",&s,&t);vis[s]=1;path.push_back(s); dfs(s,0);printf("%d\n",ans.size()-1);int line=0,pre;for(int j=1;j<ans.size();j++){if(mp[make_pair(ans[j],ans[j-1])]!=line){if(line!=0) printf("Take Line#%d from %04d to %04d.\n",line,pre,ans[j-1]);//第一轮不做处理 line=mp[make_pair(ans[j],ans[j-1])];//先保存前一个时刻的值,等下一个时刻来的时候再做处理 pre=ans[j-1];}}printf("Take Line#%d from %04d to %04d.\n",line,pre,ans[ans.size()-1]);}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/zhuixunfighting/p/10071396.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专访Vue作者尤雨溪:Vue CLI 3.0重构的原因

1、为什么要对 Vue CLI 进行大规模修改&#xff1f; 尤雨溪认为旧版本的 Vue CLI 本质上只是从 GitHub 拉取模版&#xff0c;这种拉模版的方式有几个问题&#xff1a; &#xff08;1&#xff09; 在单个模版里面同时支持太多选项会导致模版本身变得极其复杂和难以维护&#x…

java秒杀时间与服务器时间_Javascript实现秒杀倒计时(时间与服务器时间同步)...

现在有很多网站都在做秒杀商品&#xff0c;而这其中有一个很重要的环节就是倒计时。关于倒计时&#xff0c;有下面几点需要注意&#xff1a;1.应该使用服务器时间而不是本地时间(本地时间存在时区不同、用户自行设置等问题)。2.要考虑网络传输的耗时。3.获取时间时可直接从AJAX…

Java 8 Friday Goodies:本地交易范围

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系列了…

Python3.5-20190501-廖老师的

python是一门解释型\脚本语言(和js特别像,如果同时学习js和python完全搅浑了.) 在运行py时候是一句一句翻译成cpu识别的机器码,所以速度比较慢.而C程序是运行前直接编译成CPU能执行的机器码&#xff0c;所以非常快. 学习python,就需要安装python.安装的同时会有一个解释器,就是…

如何用纯 CSS 创作一个冒着热气的咖啡杯

效果预览 在线演示 按下右侧的“点击预览”按钮在当前页面预览&#xff0c;点击链接全屏预览。https://codepen.io/zhang-ou/pen/xjXxoz可交互视频教程此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。请用 chrome, safari, edge 打开观看。…

用keras实现基本的回归问题

数据集介绍 共有506个样本&#xff0c;拆分为404个训练样本和102个测试样本 该数据集包含 13 个不同的特征&#xff1a; 人均犯罪率。占地面积超过 25000 平方英尺的住宅用地所占的比例。非零售商业用地所占的比例&#xff08;英亩/城镇&#xff09;。查尔斯河虚拟变量&#xf…

Java:计算类的serialVersionUID

在本周早些时候&#xff0c;我想计算可序列化类的serialVersionUID &#xff0c;以便可以覆盖其toString方法而不会破坏所有内容。 我遇到了Frank Kim的博客文章 &#xff0c;该文章建议使用JDK附带的serialver工具。 我创建了一个Maven小项目来在一个非常简单的类上测试该工…

Codeforces Round #556 (Div. 1)

Codeforces Round #556 (Div. 1) A. Prefix Sum Primes 给你一堆1,2&#xff0c;你可以任意排序&#xff0c;要求你输出的数列的前缀和中质数个数最大。 发现只有\(2\)是偶质数&#xff0c;那么我们先放一个\(2\)&#xff0c;再放一个\(1\)&#xff0c;接下来把\(2\)全部放掉再…

FC冒险岛java版_冒险岛单机版

游戏概述冒险岛单机版是一款非常好玩的横版动作RPG游戏&#xff0c;游戏难度很适中&#xff0c;冒险岛单机版采用了与其他Q版2D游戏不同的横向卷轴的移动方式&#xff0c;场景高低落差的设计&#xff0c;整个画面层次感设计算是一级&#xff0c;喜欢这类手柄闯关游戏的玩家快来…

通过小程序实现网站扫码登录!每年都可以省 300 块...代替微信开放平台和服务号的登陆模式!

我们知道&#xff0c;要接入微信登陆有两种方式 1、微信开放平台2、微信服务号 这两种方式均可生成带参数的二维码&#xff0c;然后扫码获取用户基本信息的&#xff0c;所以我们可以在网站上用这两种方式开发网站的扫码登录&#xff0c;也是现在很多网站的通用做法。 微信开…

WAR文件与具有嵌入式服务器的Java应用程序

大多数服务器端Java应用程序&#xff08;例如&#xff0c;面向Web或面向服务的&#xff09;都希望在容器中运行。 打包这些应用程序以进行分发的传统方法是将它们捆绑为WAR文件。 这无非是具有标准目录布局的ZIP归档文件&#xff0c;其中包含运行时所需的所有库和应用程序级依赖…

JavaFX自定义控件– Nest Thermostat第3部分

嗨&#xff0c;经过与同事的讨论&#xff0c;我今天决定展示css方法不是唯一可用于创建自定义控件的方法。 当然&#xff0c;它允许提供一些外观扩展点&#xff0c;但是可以使用代码API使用相同的方法&#xff08;与向JavaFX的转换&#xff09;一起使用。 这是图形初始化方法&…

ceph rgw java_ceph rgw multisite基本用法

Realm&#xff1a; Zonegroup&#xff1a; 理解为数据中心&#xff0c;由一个或多个Zone组成&#xff0c;每个Realm有且仅有 一个Master Zonegroup&#xff0c;用于处理系统变更&#xff0c;其他的称为Slave Zonegroup&#xff0c;元数据与Master Zonegroup保持一致&#xff1b…

Python基础-Hello Word!

老师说&#xff0c;学习语言一定要有仪式感&#xff0c;So... print (“Hello Word”) 哈哈&#xff0c;好牛叉&#xff01; 一、 Python安装 Windows 1、 下载安装包 https://www.python.org/downloads/ 2、 安装 默认安装路径: C:\Users\admin\AppData\Local\Programs\Python…

微信小程序 request请求封装

request 只用 POST&#xff0c;只封装了 POST&#xff0c;等有用到 GET再重写&#xff0c;接口用的 ThinkPHP5.0主要代码 var apiurl "xxxxx"; function http_post(controller,data,cb){wx.request({url:apiurl controller,data:data,method:post,header:{Content-…

MySQL基本语句

MySQL基本语句 数据库语句介绍&#xff1a; 语言分类&#xff1a; DDL&#xff1a;数据库和表 DML&#xff1a;表中的数据 DQL&#xff1a;查询表中的数据 DCL:(授权) DDL: 1、操作数据库 创建数据库&#xff1a; create database 数据库名&#xff1b; 创建数据库&#xff0c;…

使用Java注解不正确的方法

几乎没有什么Deprecated没有适当的文档看到Deprecated方法更令人生气的了。 我感到失落。 我应该仍然使用该方法吗&#xff1f; 可能这不是开发人员的意图&#xff0c;这就是为什么他/她添加了弃用注释。 我应该使用其他东西吗&#xff1f; 所以…。 使用Deprecated的规则是什…

easypanel mysql错误_Easypanel v1.6(虚拟主机控制面板)图文使用教程

一、Easypanel软件简介&#xff1a;Easypanel是一款虚拟主机管理工具&#xff0c;它支持php(windows系统还支持asp、asp.net)、磁盘配额、在线文件管理、在线web软件安装&#xff0c;是一款集虚拟主机、ftp、mysql等功能为一体的管理系统&#xff0c;本身还集成了kangle web服务…

游戏、脑洞大开1(密码简单破译)

“二八”妙龄写密码&#xff0c;看谁聪明“爱死他”。 密文&#xff1a;766C7273626F76706A5E6F715F7271766C72706D626B71716C6C71666A62 注意&#xff1a;&#xff08;1&#xff09;此题由正心41上课的同学做 &#xff08;2&#xff09;第一个提交&#xff0c;答案&#xff1a…

html-字体属性

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;}/*font-family 字体类型浏览器默认的字体是微软雅黑&#xff0c;字体中有多个字体的时候&…