BotByte

temp.cpp

Sep 7th, 2017
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define MAX 505
  6. #define INF 100000000
  7. typedef pair<int, int> PII;
  8. vector<int> adj[MAX];
  9. int n, m, s;
  10. int cost[MAX][MAX];
  11. vector<int> shop;
  12. bool shop_vis[MAX];
  13. int dis[MAX][MAX];
  14.  
  15. void gen()
  16. {
  17.     for(int i=0; i<MAX; i++) adj[i].clear();
  18.     shop.clear();
  19.     memset(shop_vis, 0, sizeof shop_vis);
  20.     for(int i=0; i<MAX; i++){
  21.         for(int j=0; j<MAX; j++){
  22.             dis[i][j] = INF;
  23.         }
  24.     }
  25. }
  26.  
  27. int dijkstra(int s, int d)
  28. {
  29.     int dist[MAX];
  30.     bool vis[MAX];
  31.     for(int i=0; i<MAX; i++) dist[i] = INF;
  32.     dist[s] = 0;
  33.     memset(vis, false, sizeof vis);
  34.     priority_queue<PII, vector<PII>, greater<PII> > pq;
  35.     pq.push(make_pair(dist[s], s));
  36.  
  37.     while(!pq.empty()){
  38.         int u = pq.top().second;
  39.         int initial_cost = pq.top().first;
  40.         pq.pop();
  41.         if(vis[u] == true) continue;
  42.         else vis[u] = true;
  43.         if(u == d) return initial_cost;
  44.         for(int i=0; i<adj[u].size(); i++){
  45.             int v = adj[u][i];
  46.             int u_to_v = cost[u][v];
  47.             if(dist[v] > initial_cost + u_to_v){
  48.                 dist[v] = initial_cost + u_to_v;
  49.                 pq.push(make_pair(dist[v], v));
  50.             }
  51.         }
  52.     }
  53.     return INF;
  54. }
  55.  
  56. bool bfs(int s)
  57. {
  58.     bool vis[MAX];
  59.     memset(vis, false, sizeof vis);
  60.     vis[s] = true;
  61.     queue<int> Q;
  62.     Q.push(s);
  63.     while(!Q.empty()){
  64.         int u = Q.front();
  65.         Q.pop();
  66.         for(int i=0; i<adj[u].size(); i++){
  67.             int v = adj[u][i];
  68.             if(vis[v] == false){
  69.                 vis[v] = true;
  70.                 Q.push(v);
  71.             }
  72.         }
  73.     }
  74.     if(vis[n-1] == false) return false;
  75.     for(int i=0; i<shop.size(); i++){
  76.         if(vis[shop[i]] == true) shop_vis[i] = true;
  77.     }
  78.     return true;
  79. }
  80.  
  81. int main()
  82. {
  83.     freopen("in.txt", "r", stdin);
  84.     int cases;
  85.     scanf("%d", &cases);
  86.     int caseno = 0;
  87.     while(cases--){
  88.         gen();
  89.         scanf("%d %d %d", &n, &m, &s);
  90.         for(int i=0; i<s; i++){
  91.             int x;
  92.             scanf("%d", &x);
  93.             if(x == 0 || x == n-1) continue;
  94.             shop.push_back(x);
  95.         }
  96.         for(int i=1; i<=m; i++){
  97.             int u, v, c;
  98.             scanf("%d %d %d", &u, &v, &c);
  99.             adj[u].push_back(v);
  100.             cost[u][v] = c;
  101.         }
  102.         if(bfs(0) == false){
  103.             printf("Case %d: Impossible\n", ++caseno);
  104.         }
  105.         else {
  106.             for(int i=0; i<shop.size(); i++){
  107.                 if(shop_vis[i]){
  108.                     for(int j=i+1; j<shop.size(); j++){
  109.                         if(shop_vis[j]){
  110.                             dis[shop[i]][shop[j]] = dijkstra(shop[i], shop[j]);
  111.                             dis[shop[j]][shop[i]] = dijkstra(shop[j], shop[i]);
  112.                         }
  113.                     }
  114.                 }
  115.             }
  116.             for(int i=0; i<shop.size(); i++){
  117.                 if(shop_vis[i] == true){
  118.                     dis[0][shop[i]] = dijkstra(0, shop[i]);
  119.                     dis[shop[i]][0] = dijkstra(shop[i], 0);
  120.                 }
  121.                 if(shop_vis[i] == true){
  122.                     dis[shop[i]][n-1] = dijkstra(shop[i], n-1);
  123.                     dis[n-1][shop[i]] = dijkstra(n-1, shop[i]);
  124.                 }
  125.             }
  126.         }
  127.         for(int i=0; i<MAX; i++){
  128.             for(int j=0; j<MAX; j++){
  129.                 if(dis[i][j] != INF) cout << i <<  " " << j << " " << dis[i][j] << endl;
  130.             }
  131.         }
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment