poj2387- Til the Cows Come Home(最短路)
此为转载:http://blog.csdn.net/wangjian8006;
题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离
解题思路:
模版题,这题要注意的是有重边,dijkstra的算法需要考虑下,bellman-ford和spfa可以忽略这个问题
PS:虽然转载,但是只有一点是值得我们去看的,那就是在有重边的Dijkstra的处理问题,虽然很简单,但不是每个人都能想到的;
#include <iostream> using namespace std; #define inf 1<<29 #define MAXV 1005 int map[MAXV][MAXV]; int n,m; void dijkstra(){ int i,j,min,v; int d[MAXV]; bool vis[MAXV]; for(i=1;i<=n;i++){ vis[i]=0; d[i]=map[1][i]; } for(i=1;i<=n;i++){ min=inf; for(j=1;j<=n;j++) if(!vis[j] && d[j]<min){ v=j; min=d[j]; } vis[v]=1; for(j=1;j<=n;j++) if(!vis[j] && d[j]>map[v][j]+d[v]) d[j]=map[v][j]+d[v]; } printf("%d\n",d[n]); } int main(){ int i,j,a,b,c; while(~scanf("%d%d",&m,&n)){ for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) map[i][i]=0; else map[i][j]=map[j][i]=inf; for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; //这个if语句就是处理重边,保证了这条边绝对是最小的。 } dijkstra(); } return 0; }