1 #include<stdio.h> 2 #define N 210 3 #define M 0xffffff 4 int D[N];//存放v0到其余节点的最短路径 5 int arc[N][N];//存放边的权值 6 int vexnum,arcnum;//村庄数及道路数 7 int ShortPath(int v0,int v1) 8 { 9 int v,w,k,min; 10 int vis[N];//标志数组,记录最小路径节点 11 if(v0==v1) return 0; 12 for(v=0;v<vexnum;v++){ 13 vis[v]=0; 14 D[v]=arc[v0][v];//D[]赋初值 15 } 16 for(vis[v0]=v=1;v<vexnum;v++){ 17 for(min=M,w=0;w<vexnum;w++) 18 if(!vis[w]&&D[w]<min){//找当前权值最小的边 19 k=w; 20 min=D[w]; 21 } 22 vis[k]=1;//加入最短路径序列 23 for(w=0;w<vexnum;w++) 24 if(!vis[w]&&(min+arc[k][w]<D[w]))//更新路径长度 25 D[w]=min+arc[k][w]; 26 } 27 if(D[v1]==M) return -1; 28 else return D[v1]; 29 } 30 int main() 31 { 32 int i,j,k,v0,v,w; 33 while(~scanf("%d%d",&vexnum,&arcnum)) 34 { 35 for(i=0;i<vexnum;i++) 36 for(j=0;j<vexnum;j++) 37 arc[i][j]=M;//赋初值,无穷大表无路径不可达 38 for(k=0;k<arcnum;k++) 39 { 40 scanf("%d%d%d",&i,&j,&w); 41 if(w<arc[i][j]) 42 arc[j][i]=arc[i][j]=w; 43 } 44 scanf("%d%d",&v0,&v); 45 printf("%d\n",ShortPath(v0,v)); 46 } 47 return 0; 48 }