poj2387(最簡單的最短路)
阿新 • • 發佈:2018-12-30
此題是最簡單的短路,告訴你邊數m,點數n,接下來m行點,點,距離,求1~n的最短距離
但是要考慮重邊(wa了兩次看題解才發現這個坑...),即2到3可能不止一條路,只需記錄最短的那條路,我用迪傑斯特拉
#include <stdio.h> #include <string.h> int dis[1005]; int s[1005][1005]; int book[1005],min; int main() { int n,m,i,j,a,b,c,u,k; memset(dis,0,sizeof(dis)); memset(book,0,sizeof(book)); scanf("%d%d",&m,&n); for (i=0;i<=n;i++) for (j=0;j<=n;j++) if (i==j) s[i][j]=0; else s[i][j]=99999999; for (i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); if (c<s[a][b]) { s[a][b]=c; s[b][a]=c; } } for (i=2;i<=n;i++) dis[i]=s[1][i]; book[1]=1; for (i=1;i<=n-1;i++) { min=99999999; for (j=1;j<=n;j++) if ((min>dis[j])&&(!book[j])) { min=dis[j]; u=j; } book[u]=1; for (k=1;k<=n;k++) if (dis[u]+s[u][k]<dis[k]) { dis[k]=dis[u]+s[u][k]; } } printf("%d\n",dis[n]); return 0; }