Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <fstream>
  5. #include <cstdlib>
  6. #include <queue>
  7. #include <string.h>
  8. #include <algorithm>
  9.  
  10. using namespace std;
  11.  
  12. int main() {
  13.     int n, m;
  14.     cin >> n >> m;
  15.    
  16.     vector < vector<int> > g(m);
  17.    
  18.     for(int i = 0; i < n; i++) {
  19.         int len, s, to;
  20.         cin >> len;
  21.         cin >> s;
  22.         s--;
  23.         len--;
  24.        
  25.         for(int j = 0; j < len; j++)  {
  26.             cin >> to;
  27.             to--;
  28.             g[s].push_back(to);
  29.             g[to].push_back(s);
  30.            
  31.             s = to;
  32.         }
  33.     }
  34.    
  35.    
  36.    
  37.     int start, finish = 0, r;
  38.     cin >> r;
  39.     vector < pair <int, int> > startPoints(r);
  40.    
  41.     for (auto &i : startPoints) {
  42.         cin >> i.first >> i.second;
  43.         i.first--;
  44.     }
  45.    
  46.     int k;
  47.     cin >> k;
  48.     vector < pair <int, int> > finishPoints(k);
  49.     for(auto &i : finishPoints)
  50.         cin >> i.first >> i.second;
  51.    
  52.     vector <int> ansPath;
  53.     int ansMin = 1e9;
  54.    
  55.    
  56.     for (int i = 0; i < r; i++) {
  57.         start = startPoints[i].first;
  58.         queue<int> q;
  59.         int d[m], p[m];
  60.         bool used[m];
  61.         memset(used, false, sizeof used);
  62.         memset(d, 0, sizeof d);
  63.         memset(p, 0, sizeof m);
  64.        
  65.         q.push(start);
  66.         d[start] = startPoints[i].second;
  67.         p[start] = -1;
  68.         used[start] = true;
  69.        
  70.         while (!q.empty()) {
  71.             int v = q.front();
  72.             q.pop();
  73.            
  74.             for(int i = 0; i < g[v].size(); i++) {
  75.                 int to = g[v][i];
  76.                
  77.                 if(!used[to]) {
  78.                     q.push(to);
  79.                     d[to] = d[v] + 1;
  80.                     p[to] = v;
  81.                     used[to] = true;
  82.                 }
  83.             }
  84.         }
  85.        
  86.         int minn = 1e9;
  87.         for(auto i : finishPoints) {
  88.             if(d[i.first - 1] + i.second < minn) {
  89.                 minn = d[i.first - 1] + i.second;
  90.                 finish = i.first - 1;
  91.             }
  92.         }
  93.        
  94.         if(minn < ansMin) {
  95.             ansMin = minn;
  96.             vector <int> path;
  97.             for (int v = finish; v != -1; v = p[v])
  98.                 path.push_back (v);
  99.            
  100.             reverse (path.begin(), path.end());
  101.             ansPath = path;
  102.            
  103.         }
  104.     }
  105.    
  106.    
  107.     cout << ansMin << endl;
  108.     for (auto i : ansPath)
  109.         cout << i + 1 << ' ';
  110.     cout << endl;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement