L2-001. 紧急救援-Dijkstra算法的综合运用
2016-05-25 21:36
435 查看
#include "iostream" using namespace std; #define Max 500 #define Sky 99999 int Graph[Max][Max],Top,Start,End,Edge; int Dist[Max],Move[Max],Peo[Max],Sum[Max],Way[Max]; void Dis() { int i,j; for(i=0;i<Top;i++) { Dist[i]=Graph[Start][i]; Move[i]=false; if(i!=Start && Graph[Start][i]!=Sky) { Sum[i]=Peo[Start]+Peo[i]; Way[i]=1; } } Dist[Start]=0; Move[Start]=true; Sum[Start]=Peo[Start]; Way[Start]=1; for(i=1;i<=Top-2;i++) { int minw,maxp; minw=maxp=Sky; int k=Start; for(j=0;j<Top;j++) { if(!Move[j]) { if(minw>Dist[j]) { minw=Dist[j]; k=j; maxp=Sum[j]; } if(minw==Dist[j] && maxp<Sum[j]) { maxp=Sum[j]; k=j; } } } Move[k]=true; for(j=0;j<Top;j++) { if(!Move[j]) { if(Dist[j]==Dist[k]+Graph[k][j]) { Way[j]+=Way[k]; if(Sum[j]<Sum[k]+Peo[j]) { Sum[j]=Sum[k]+Peo[j]; } } if(Dist[j]>Dist[k]+Graph[k][j]) { Dist[j]=Dist[k]+Graph[k][j]; Sum[j]=Sum[k]+Peo[j]; Way[j]=Way[k]; } } } } } void Dfs(int end,int Sump) { if(end==Start) { return; } for(int j=0;j<Top;j++) { if(Sump-Peo[end]==Sum[j] && Dist[end]-Graph[end][j]==Dist[j]) { Dfs(j,Sum[j]); cout<<j<<" "; } } } int main( ) { //freopen("1.txt","r",stdin); cin>>Top>>Edge>>Start>>End; int i,j; for(i=0;i<Top;i++) for(j=0;j<Top;j++) Graph[i][j]=Sky; for(i=0;i<Top;i++) cin>>Peo[i]; for(i=0;i<Edge;i++) { int x,y,z; cin>>x>>y>>z; Graph[x][y]=Graph[y][x]=z; } Dis(); cout<<Way[End]<<" "<<Sum[End]<<endl; Dfs(End,Sum[End]); cout<<End<<endl; return 0; }
相关文章推荐
- 集合之List(2)
- [Android]自定义万能Dialog
- 自定义加载圈动画
- 数数字(51nod 1770)
- 如何使用Dockerfile构建镜像
- 第六次c++作业————代码篇
- 2016/05/25 empty() 与 isset()的区别
- vector作为参数传递的几种情况
- Java中HashMap、TreeMap的区别
- JS转换HTML转义符
- linux基本命令(34)——du命令
- Android webview 使用HTTPS时有的图片不能加载
- 两点之间最短路径算法(Single-Dijkstra-shortest path)
- django静态文件服务器的配置
- HDU 1078 FatMouse and Cheese(记忆化搜索)
- C语言C++语言中静态变量和静态函数
- vertica-使用dbvis工具报I O错误
- 盒子的的浮动
- 俄罗斯方块C语言的初步感受
- mysql-proxy读写分离