The 2019 Asia Nanchang First Round Online Programming Contest B. Fire-Fighting Hero

题目链接: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 }

 

上一篇:[ZOJ1002] Fire Net


下一篇:近期的做题总结