水题,但是要注意处理重边的情况,因为一开始没处理,结果wa了很多次。
#include <stdio.h> #include <string.h> #define INIMAX 0x7f7f7f7f int dist[210]; int S[210]; int M,N; int Graph[205][205]; void dijk(int begin){ memset(S,0,sizeof(S)); for(int i = 0;i < N;++i){ dist[i] = Graph[begin][i]; } dist[begin] = 0; S[begin] = 1; int k; for(int i = 1;i < N; ++i){ int min = INIMAX; for(int j = 0; j < N; ++j){ if(!S[j]&&dist[j] < min){ min = dist[j]; k = j; } } S[k] = 1; for(int j = 0;j < N; ++j){ if(!S[j]&& dist[j] > dist[k] + Graph[k][j]){ dist[j] = dist[k] + Graph[k][j]; } } } return; } int main(int argc, char *argv[]) { //FILE *fp; //fp = freopen("in1.txt","r",stdin); int x,y,di; int begin,end; while(~scanf("%d%d",&N,&M)){ for(int i = 0; i < N;++i) { for(int j = 0; j < N;++j) Graph[i][j] = INIMAX; } for(int i = 0; i < M; ++i){ scanf("%d%d%d",&x,&y,&di); if(Graph[x][y] > di){ Graph[x][y] = di; Graph[y][x] = di; } } scanf("%d%d",&begin,&end); dijk(begin); if(dist[end] != INIMAX) printf("%d\n",dist[end]); else printf("-1\n"); } return 0; }