Guest User

Untitled

a guest
Sep 25th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1. #include <vector>
  2. #include <set>
  3. #include <cstdio>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. const int INF = 1e6 + 1;
  9.  
  10.  
  11. int main()
  12. {
  13.  
  14.     int ntest;
  15.    
  16.     scanf("%d", &ntest);
  17.  
  18.     for (int test = 0; test < ntest; ++test)
  19.     {
  20.         int n, m, r;
  21.         int a, b, l;
  22.         int h, t;
  23.  
  24.         vector<vector<int> > roads;
  25.         vector<int> answers;
  26.         vector<int> vert2id;
  27.         vector<set<int> > prevs;
  28.         vector<int> matches;
  29.  
  30.         scanf("%d %d %d", &m, &n, &r);
  31.  
  32.         roads.assign(n, vector<int> (n, INF));
  33.         prevs.assign(n, set<int>());
  34.         vert2id.assign(n, -1);
  35.  
  36.         for (int i = 0; i < r; ++i) {
  37.             scanf("%d %d %d", &a, &b, &l);
  38.             --a;
  39.             --b;
  40.  
  41.             roads[b][a] = roads[a][b] = min(roads[a][b], l);
  42.         }
  43.  
  44.         for (int i = 0; i < n; ++i) {
  45.             roads[i][i] = 0;
  46.         }
  47.  
  48.         for (int k = 0; k < n; ++k) {
  49.             for (int i = 0; i < n; ++i) {
  50.                 for (int j = 0; j < n; ++j) {
  51.                     roads[i][j] = min(roads[i][j], roads[i][k] + roads[k][j]);
  52.                 }
  53.             }
  54.         }
  55.  
  56.         bool error = false;
  57.         set<int> ends;
  58.  
  59.         for (int i = 0; i < m; ++i) {
  60.             scanf("%d %d", &h, &t);
  61.             --h;
  62.             vert2id[h] = i;
  63.  
  64.             for (int j = 0; j < n; ++j) {
  65.                 if (roads[h][j] == t) {
  66.                     prevs[j].insert(h);
  67.                     ends.insert(j);
  68.                 }
  69.             }
  70.         }
  71.  
  72.         matches.assign(n, -1);
  73.  
  74.         for (int i = 0; i < m; ++i) {
  75.             int k = 0;
  76.  
  77.             for (; k < n; ++k) {
  78.                 if (prevs[k].size() == 1) {
  79.                     break;
  80.                 }
  81.             }
  82.  
  83.             if (k < n) {
  84.                 int from = *(prevs[k].begin());
  85.  
  86.                 matches[k] = from;
  87.  
  88.                 for (int j = 0; j < n; ++j) {
  89.                     prevs[j].erase(from);
  90.                 }
  91.             } else {
  92.                 error = true; // greedy failed to find available vertex
  93.                 break;
  94.             }
  95.         }
  96.  
  97.         if (ends.size() != m) { // amount of destinations != amount of starting points
  98.             error = true;
  99.         }
  100.  
  101.         if (! error) {
  102.             answers.assign(m, -1);
  103.  
  104.             for (int i = 0; i < n; ++i) {
  105.                 if (matches[i] != -1) {
  106.                     answers[vert2id[matches[i]]] = i + 1;
  107.                 }
  108.             }
  109.  
  110.             for (int i = 0; i < m; ++i) {
  111.                 printf("%d ", answers[i]);
  112.             }
  113.             printf("\n");
  114.         } else {
  115.             printf("-1\n");
  116.         }
  117.     }
  118.  
  119.     return 0;
  120. }
Add Comment
Please, Sign In to add comment