南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。
他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。
现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。
现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。
注意,两个城市之间可能不只一条路。
1 3 8 9 8 1 2 3 1 2 1 2 3 2 1 4 2 2 5 3 3 6 2 4 7 1 5 7 3 5 8 2 6 8 2
4
dijkstra思想就在这个图片里面。
这是这位大牛讲的dijkstra思想。点击打开链接
#include <stdio.h> #include <string.h> #include <queue> #define inf 0x3fffffff using namespace std; int buDui[105],map[1005][1005],vis[1005],m,stamp[1005]; queue<int> s; int dijkstra(int star,int end,int min) { s.push(star); while(!s.empty()) { star=s.front(); for(int i=1;i<=m;i++) { if(i!=star&&map[star][i]&&map[star][i]+stamp[star]<stamp[i]&&!vis[i]) { s.push(i); stamp[i]=map[star][i]+stamp[star];//stamp数组更新star到i的距离 } } vis[star]=1; s.pop(); } return stamp[end]; } int main() { int ncase,min,p,q,n,x,a,b,cost; scanf("%d",&ncase); while(ncase--) { memset(map,0,sizeof(map)); scanf("%d %d %d %d",&n,&m,&p,&q); for(int i=0;i<n;i++) scanf("%d",&x),buDui[i]=x; for(int i=0;i<p;i++) { scanf("%d %d %d",&a,&b,&cost); map[a][b]=map[b][a]=cost; } min=inf; for(int i=0;i<n;i++) { memset(stamp,100,sizeof(stamp)); memset(vis,0,sizeof(vis)); stamp[buDui[i]]=0; int result=dijkstra(buDui[i],q,inf); if(result<min) min=result; } printf("%d\n",min); } return 0; }