最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 49088 Accepted Submission(s): 21616
输入保证至少存在1条商店到赛场的路线。
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
32
dijkstra算法》
#include<cstdio> #include<cstring> #define max 100+10 #define INF 0x3f3f3f//开到无限大 using namespace std; int map[max][max];//二维数组标记 int dis[max];//记录当前最短路径 int visit[max];//记录是否被访问过 int n,m; void dijkstra() { int next;//当前最短路径的点 int min; int i,j; memset(visit,0,sizeof(visit));//要清0 for(i=1;i<=n;i++)//路径初始化 { dis[i]=map[1][i]; } visit[1]=1;//1已经被访问 for(i=2;i<=n;i++) { min=INF; for(j=1;j<=n;j++) { if(visit[j]==0&&min>dis[j])//大于 { min=dis[j]; next=j;//当前最短路径终点 } } visit[next]=1; for(j=1;j<=n;j++)//更新距离 { if(visit[j]==0&&dis[j]>dis[next]+map[next][j])//大于 dis[j]=dis[next]+map[next][j]; } } printf("%d\n",dis[n]); } int main() { int a,b,c; while(scanf("%d%d",&n,&m)&&(n||m)) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) map[i][j]=0;//很重要 else map[i][j]=INF; } } for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c)//防止有重复数据 1 2 7、 2 1 4 map[a][b]=map[b][a]=c; } dijkstra(); } return 0; }