【PAT甲级】1111 Online Map (30分)(dijkstra+路径记录)
题意:
输入两个正整数N和M(N<=500,M<=N^2),分别代表点数和边数。接着输入M行每行包括一条边的两个结点(0~N-1),这条路的长度和通过这条路所需要的时间。接着输入两个整数表示起点和终点,输出路径最短的路,如果多条路路径最短输出其中通过时间最短的路,以及通过时间最短的路,如果通过时间最短的路有多条输出其中经过点个数最短的路,如果两条路相同,则合并输出。详见样例。
trick:
用邻接表存图,优先队列优化版本的dijkstra做,最后一个测试点会段错误,将数组开到25000以上后变为答案错误,实际上看似没有访问500~25000这一段数组,原因暂时不明,对于点少边多的图,可能用朴素写法效率较高,并且邻接表存图并不会占用太大空间,完全可以实现。
AAAAAccepted code:
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
int dis[],tim[];
int e[][],w[][];
int pre[],timpre[],weight[],num[];
bool vis[];
vector<int>dispath,timpath;
int s,t;
void dfsdispath(int v){
dispath.push_back(v);
if(v==s)
return ;
dfsdispath(pre[v]);
}
void dfstimpath(int v){
timpath.push_back(v);
if(v==s)
return ;
dfstimpath(timpre[v]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
for(int i=;i<;++i)
dis[i]=1e9+,tim[i]=1e9+,weight[i]=1e9+;
for(int i=;i<;++i)
for(int j=;j<;++j)
e[i][j]=w[i][j]=1e9+;
int n,m;
cin>>n>>m;
int u,v,flag,x,y;
for(int i=;i<m;++i){
cin>>u>>v>>flag>>x>>y;
e[u][v]=x;
w[u][v]=y;
if(!flag){
e[v][u]=x;
w[v][u]=y;
}
}
cin>>s>>t;
dis[s]=;
for(int i=;i<n;++i){
int u=-,mn=1e9+;
for(int j=;j<n;++j){
if(!vis[j]&&dis[j]<mn){
u=j;
mn=dis[j];
}
}
if(u==-)
break;
vis[u]=;
for(int v=;v<n;++v){
if(!vis[v]&&e[u][v]<1e9+){
if(e[u][v]+dis[u]<dis[v]){
dis[v]=e[u][v]+dis[u];
weight[v]=weight[u]+w[u][v];
pre[v]=u;
}
else if(e[u][v]+dis[u]==dis[v]&&weight[v]>weight[u]+w[u][v]){
weight[v]=weight[u]+w[u][v];
pre[v]=u;
}
}
}
}
dfsdispath(t);
tim[s]=;
for(int i=;i<;++i)
vis[i]=;
for(int i=;i<n;++i){
int u=-,mn=1e9+;
for(int j=;j<n;++j){
if(!vis[j]&&mn>tim[j]){
u=j;
mn=tim[j];
}
}
if(u==-)
break;
vis[u]=;
for(int v=;v<n;++v){
if(!vis[v]&&w[u][v]<1e9+){
if(w[u][v]+tim[u]<tim[v]){
tim[v]=w[u][v]+tim[u];
timpre[v]=u;
num[v]=num[u]+;
}
else if(w[u][v]+tim[u]==tim[v]&&num[u]+<num[v]){
timpre[v]=u;
num[v]=num[u]+;
}
}
}
}
dfstimpath(t);
cout<<"Distance = "<<dis[t];
if(dispath==timpath)
cout<<"; Time = "<<tim[t]<<": ";
else{
cout<<": ";
for(int i=dispath.size()-;i>=;--i){
cout<<dispath[i];
if(i>)
cout<<" -> ";
}
cout<<"\nTime = "<<tim[t]<<": ";
}
for(int i=timpath.size()-;i>=;--i){
cout<<timpath[i];
if(i>)
cout<<" -> ";
}
return ;
}
【PAT甲级】1111 Online Map (30分)(dijkstra+路径记录)的更多相关文章
- PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)
本文章同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90041078 1111 Online Map (30 分) ...
- PAT甲级1111. Online Map
PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...
- PAT 甲级 1030 Travel Plan (30 分)(dijstra,较简单,但要注意是从0到n-1)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, to ...
- PAT 甲级 1072 Gas Station (30 分)(dijstra)
1072 Gas Station (30 分) A gas station has to be built at such a location that the minimum distance ...
- PAT 甲级 1049 Counting Ones (30 分)(找规律,较难,想到了一点但没有深入考虑嫌麻烦)***
1049 Counting Ones (30 分) The task is simple: given any positive integer N, you are supposed to co ...
- PAT 甲级 1080 Graduate Admission (30 分) (简单,结构体排序模拟)
1080 Graduate Admission (30 分) It is said that in 2011, there are about 100 graduate schools ready ...
- PAT 甲级 1026 Table Tennis (30 分)(坑点很多,逻辑较复杂,做了1天)
1026 Table Tennis (30 分) A table tennis club has N tables available to the public. The tables are ...
- PAT 甲级 1022 Digital Library (30 分)(字符串读入getline,istringstream,测试点2时间坑点)
1022 Digital Library (30 分) A Digital Library contains millions of books, stored according to thei ...
- PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]
题目 Input our current position and a destination, an online map can recommend several paths. Now your ...
随机推荐
- 网络编程UDP、TCP详解
网络编程 网络编程主要用于解决计算机与计算机(手机.平板-)之间的数据传输问题. 1.InetAddress(IP类) 方法: 方法 描述 getLocalHost() 获取本机的IP地址对象 ...
- MapReduce异常:java.lang.ClassCastException: interface javax.xml.soap.Text
MapReduce异常:java.lang.ClassCastException: interface javax.xml.soap.Text java.lang.ClassCastException ...
- 纯css实现移动端横向滑动列表(可应用于ionic3移动app开发)
前几天在公司做开发的时候碰到一个列表横向滑动的功能,当时用了iscroll做,结果导致手指触到列表的范围内竖向滑动屏幕滑动不了的问题. 这个问题不知道iscroll本身能不能解决,当时选择了换一种方式 ...
- Docker的安装和操作(虚拟机+linux系统)
1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像: 运行中的这 ...
- C++-POJ2955-Brackets[DP]
题意就是,找出最长合法子括号序列 容易想到设f[l][r]为l~r的最长合法子括号序列的长度 然后从短的状态往长的状态枚举,不断更新答案就可以了 //#include<bits/stdc++.h ...
- SD卡报错“error -110 whilst initialising SD card”
目前开发遇到了某些SD卡和TI的SOC芯片的驱动不协调的地方,具体表现为: uboot 阶段初始化mmc dev 1 没有任何串口信息输出,无法读写mmc Kernel阶段报错”SD卡初始化失败 er ...
- C#通过属性名字符串获取、设置对象属性值
之前理工项目从这个博客找到了相对应的方法:C#通过属性名字符串获取.设置对象属性值 https://www.cnblogs.com/willingtolove/p/12198871.html
- python3 win 建立虚拟环境(virtualenv)
1.安装virtualenv pip3 install virtualenv 2.进入即将创建虚拟环境的目录 cd xxxx 3.创建虚拟环境 py -3 -m venv testxunihua 4. ...
- redis 的安装和使用
一.套用别人的话: redis 很牛叉,能将不同类型的数据存到内存,存到内存取出的时候就快了.所以,他很受欢迎.还有一个很牛叉的叫memcache ,但是他存的数据类型很有限,只能存入string 类 ...
- 使用C#使用Windows的HID通信
本文转载于:https://blog.csdn.net/u010875635/article/details/73321066 Windows使用HID通信相对比较简单,HID都是通过PID.VID信 ...