题目链接:https://nanti.jisuanke.com/t/41349
题意:有一个灭火英雄,和一个灭火团队,一个人与一个团队比较。
灭火英雄到其他灭火点的最短路最大值,与一个团队到其他灭火点的最短路的最大距离*C,进行比较。
如果一个团队的一个人在k点,那么k点的最短路就是0,这样,我们可以构建一个虚拟点“0”点,跑团队的最短路
可以让“0”点到其他团队队员点为0,到其他点为inf,然后跑一次最短路就可以了,下面的代码是比赛时候的,懒得改,直接很难看的写了。
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <string> 6 using namespace std; 7 8 typedef long long LL; 9 #define inf 1e9 10 #define rep(i,j,k) for(int i = (j); i <= (k); i++) 11 #define rep__(i,j,k) for(int i = (j); i < (k); i++) 12 #define per(i,j,k) for(int i = (j); i >= (k); i--) 13 #define per__(i,j,k) for(int i = (j); i > (k); i--) 14 15 const int N = 1100; 16 bool vis[N]; 17 int mp[N][N]; 18 bool fired[N]; 19 int team[N]; 20 int dis[N]; 21 int V,E,S,K,C; 22 23 int dijkstra(int s){ 24 25 rep(i,1,V) vis[i] = false; 26 27 if(s){ 28 rep(i,1,V) dis[i] = inf; 29 rep(i,1,V) dis[i] = mp[s][i]; 30 vis[s] = true; 31 32 rep(i,2,V){//团队的 33 34 int x = -1; 35 int c = inf; 36 37 rep(j,1,V){ 38 39 if(!vis[j] && c > dis[j]) x = j, c = dis[j]; 40 } 41 if(x == -1) continue; 42 43 vis[x] = true; 44 rep(p,1,V){ 45 if(!vis[p] && dis[x] + mp[x][p] < dis[p]){ 46 dis[p] = dis[x] + mp[x][p]; 47 } 48 } 49 50 } 51 } 52 else{//英雄的 53 rep(i,1,V) dis[i] = inf; 54 rep(i,1,K) dis[team[i]] = 0; 55 vis[s] = true; 56 57 rep(i,1,V){ 58 59 int x = -1; 60 int c = inf; 61 62 rep(j,1,V){ 63 64 if(!vis[j] && c > dis[j]) x = j, c = dis[j]; 65 } 66 if(x == -1) continue; 67 68 vis[x] = true; 69 rep(p,1,V){ 70 if(!vis[p] && dis[x] + mp[x][p] < dis[p]){ 71 dis[p] = dis[x] + mp[x][p]; 72 } 73 } 74 75 } 76 } 77 78 79 int ans = 0; 80 rep(i,1,V){ 81 82 if(dis[i] == inf) continue; 83 if(fired[i]) ans = max(ans,dis[i]); 84 } 85 86 return ans; 87 } 88 89 int main(){ 90 91 ios::sync_with_stdio(false); 92 cin.tie(0); 93 94 int T; 95 cin >> T; 96 97 int p = 0; 98 int q = 0; 99 while(T--){ 100 cin >> V >> E >> S >> K >> C; 101 102 rep(i,1,V) rep(j,1,V){ 103 if(i == j) mp[i][j] = 0; 104 else mp[i][j] = inf; 105 } 106 107 rep(i,1,K){ 108 cin >> team[i]; 109 } 110 111 int u,v,w; 112 113 rep(i,1,E){ 114 cin >> u >> v >> w; 115 fired[v] = true; 116 if(mp[u][v] > w){ 117 mp[u][v] = mp[v][u] = w; 118 } 119 } 120 121 p = dijkstra(S);//英雄 122 123 q = dijkstra(0);//团队 124 125 if(p <= q*C) cout << p << endl; 126 else cout << q << endl; 127 } 128 129 getchar();getchar(); 130 131 return 0; 132 }