题目链接:
标准最短路径问题,起点可以看作是草儿家,从草儿家到与家相连的地方time=0,dijkstra求最短路径,然后找出想去地方的最小代价就行了,经典模板题,但是WA了好几次,开始找不出错误,后来发现体重有句话:(1=<(a,b)<=1000;a,b 之间可能有多条路),瞬时明白了,两点之间可以有多条路径的。
当然我的代码中,dijkstra 中的 n有些大了,我们可以在主函数中记录下u,v的最大值作为n就够了,不必每次都遍历完
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 #define INF 100000000 5 #define n 1000 6 7 using namespace std; 8 int map[1100][1100],dis[1100],flag[1100]; 9 int T,S,D;10 void dijkstra()11 {12 int i,j,k,min;13 memset(flag,0,sizeof(flag));14 flag[0]=1;15 for(i=0;i<=n;i++)16 {17 dis[i]=map[0][i];18 }19 for(i=1;i dis[k]+map[k][j])34 dis[j]=dis[k]+map[k][j];35 }36 }37 }38 int main()39 {40 int u,v,w,x,y,min;41 while(scanf("%d%d%d",&T,&S,&D)!=EOF)42 {43 for(int i=0;i<1010;i++)44 for(int j=0;j<1010;j++)45 map[i][j]=INF;46 for(int i=1;i<=T;i++)47 {48 scanf("%d%d%d",&u,&v,&w);49 map[u][v]=map[u][v]>w?w:map[u][v]; //可能两点之间有多条路径50 map[v][u]=map[u][v];51 }52 for(int i=1;i<=S;i++)53 {54 scanf("%d",&x);55 map[0][x]=0;56 map[x][0]=0;57 }58 dijkstra();59 min=INF;60 for(int i=0;i dis[y]) min=dis[y];64 }65 printf("%d\n",min);66 }67 return 0;68 }