团体程序设计天梯赛-练习集L2-001. 紧急救援(dijkstra)
2016-07-14 18:20
429 查看
L2-001. 紧急救援
时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
输出格式:
第一行输出不同的最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出首尾不能有多余空格。
输入样例:
输出样例:
思路:Dijkstra算法的加强版
时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
输出格式:
第一行输出不同的最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出首尾不能有多余空格。
输入样例:
4 5 0 3 20 30 40 10 0 1 1 1 3 2 0 3 3 0 2 2 2 3 2
输出样例:
2 60 0 1 3
思路:Dijkstra算法的加强版
1 #include<bits/stdc++.h> 2 #define inf 1e9+7 3 using namespace std; 4 stack<int >q; 5 struct node{ 6 long long value=-1; 7 int cost=inf; 8 int pointvalue; 9 int vis=0; 10 int cnt=0; 11 int fa; 12 }; 13 node arr[505]; 14 int mat[505][505]; 15 int check(int n) 16 { 17 for(int i=0;i<n;i++) 18 if(arr[i].vis==0) return 1; 19 return 0; 20 } 21 void dijkstra(int start,int end,int n) 22 { 23 int now=start; 24 arr[start].cnt=1; 25 arr[start].vis=1; 26 arr[start].value=arr[start].pointvalue; 27 arr[start].cost=0; 28 arr[start].fa=start; 29 for(int i=0;i<n;i++) 30 { 31 int maxx=inf; 32 for(int j=0;j<n;j++)//relaxion 33 { 34 if(now==j) continue; 35 if(arr[now].cost!=inf&&arr[now].cost+mat[now][j]<arr[j].cost&&arr[j].vis==0) 36 { 37 arr[j].cost=arr[now].cost+mat[now][j]; 38 arr[j].value=arr[now].value+arr[j].pointvalue; 39 arr[j].fa=now; 40 arr[j].cnt=arr[now].cnt; 41 } 42 else if(arr[now].cost+mat[now][j]==arr[j].cost) 43 { 44 arr[j].cnt+=arr[now].cnt; 45 if(arr[j].value<arr[now].value+arr[j].pointvalue) 46 { 47 arr[j].value=arr[now].value+arr[j].pointvalue; 48 arr[j].fa=now; 49 } 50 } 51 } 52 for(int j=0;j<n;j++) 53 { 54 if(now==j) continue; 55 if(arr[j].vis==0&&arr[j].cost<maxx) 56 { 57 maxx=arr[j].cost; 58 now=j; 59 } 60 } 61 arr[now].vis=1; 62 } 63 } 64 int main() 65 { 66 int n,m,start,end; 67 cin>>n>>m>>start>>end; 68 for(int i=0;i<n;i++) 69 cin>>arr[i].pointvalue; 70 for(int i=0;i<n;i++) 71 { 72 for(int j=0;j<n;j++) 73 { 74 mat[i][j]=inf; 75 } 76 } 77 for(int i=0;i<m;i++) 78 { 79 int s,e,k; 80 cin>>s>>e>>k; 81 mat[s][e]=mat[e][s]=k; 82 } 83 dijkstra(start,end,n); 84 cout<<arr[end].cnt<<' '<<arr[end].value; 85 while(arr[end].fa!=end) 86 { 87 q.push(end); 88 end=arr[end].fa; 89 } 90 cout<<endl; 91 q.push(start); 92 while(!q.empty()) 93 { 94 cout<<q.top(); 95 q.pop(); 96 if(!q.empty()) 97 cout<<' '; 98 } 99 return 0; 100 }
相关文章推荐
- 团体程序设计天梯赛-练习集L1-024. 后天
- 团体程序设计天梯赛-练习集L1-023. 输出GPLT
- 团体程序设计天梯赛-练习集L1-022. 奇偶分家
- 团体程序设计天梯赛-练习集L1-021. 重要的话说三遍
- web开发(八)之验证码的生成
- maven 编译后,没有生成class文件的解决方案
- 团体程序设计天梯赛-练习集L1-020. 帅到没朋友
- python,java,c,c++ 效率比较
- 团体程序设计天梯赛-练习集L1-019. 谁先倒
- a标签设置不跳转
- 团体程序设计天梯赛-练习集L1-018. 大笨钟
- CodeForces Gym 100989D 1D Cafeteria (B) SET
- C++构造函数
- 20160714
- http tcp/ip socket
- (二)Kafka动态增加Topic的副本(Replication)
- 移动端资源
- git提交项目到多个网站
- VS2010/MFC(对话框:模态对话框及其弹出过程)
- 关于"net::ERR_CONNECTION_ABORTED"和"Firebug 达到了 Post 请求大小限制"的问题