南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。
他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。
如今,小工军师告诉南将军。第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿近期路去往暴乱城市平乱。
如今已知在随意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序猿,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。
注意,两个城市之间可能不仅仅一条路。
随后的一行是N个整数。表示部队所在城市的编号。
再之后的P行,每行有三个正整数,a,b,t(1<=a,b<=M,1<=t<=100),表示a,b之间的路假设行军须要用时为t
数据保证暴乱的城市是可达的。
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
#include <stdio.h> #include <string.h> #include <queue> #define maxn 1010 #define maxm 200010 #define inf 0x3f3f3f3f int head[maxn]; struct Node { int v, dis, next; } E[maxm]; bool vis[maxn]; int dist[maxn], tar[maxn]; int n, m, p, q, id; void addEdge(int u, int v, int dis) { E[id].v = v; E[id].dis = dis; E[id].next = head[u]; head[u] = id++; } void getMap() { scanf("%d%d%d%d", &n, &m, &p, &q); int i, u, v, dis; id = 0; memset(head, -1, sizeof(int) * (m + 1)); for(i = 0; i < n; ++i) scanf("%d", &tar[i]); while(p--) { scanf("%d%d%d", &u, &v, &dis); addEdge(u, v, dis); addEdge(v, u, dis); } } void SPFA() { std::queue<int> Q; memset(dist, 0x3f, sizeof(int) * (m + 1)); memset(vis, 0, sizeof(bool) * (m + 1)); dist[q] = 0; vis[q] = 1; Q.push(q); int u, v, i; while(!Q.empty()) { u = Q.front(); Q.pop(); vis[u] = 0; for(i = head[u]; i != -1; i = E[i].next) { if(dist[v = E[i].v] > dist[u] + E[i].dis) { dist[v] = dist[u] + E[i].dis; if(!vis[v]) { vis[v] = 1; Q.push(v); } } } } } void solve() { SPFA(); int ans = inf; for(int i = 0; i < n; ++i) if(ans > dist[tar[i]]) ans = dist[tar[i]]; printf("%d\n", ans); } int main() { // freopen("stdin.txt", "r", stdin); int t; scanf("%d", &t); while(t--) { getMap(); solve(); } return 0; }
版权声明:本文博客原创文章。博客,未经同意,不得转载。