Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. #define pb push_back
  7. #define mk make_pair
  8.  
  9.  
  10. typedef long long ll;
  11.  
  12. const int Z = 1111;
  13. const int inf = int(1e9) + 123;
  14. const ll llinf = ll(1e18) + 123;
  15.  
  16. vector <pair<int, pair<int,string>>> g[Z];
  17. int a[Z];
  18. string c[Z];
  19. int d[Z], pr[Z];
  20.  
  21. int main () {
  22.     ios_base::sync_with_stdio(false);
  23.     freopen("input.txt","r",stdin);
  24.     freopen("output.txt","w",stdout);
  25.     int n, m;
  26.     cin >> n >> m;
  27.     for (int i = 1; i <= n; i++) {
  28.         cin >> c[i];
  29.         a[i] = c[i].size();
  30.     }
  31.     for (int i = 1; i <= m; i++) {
  32.         int x, y;
  33.         cin >> x >> y;
  34.         g[x].pb(mk(y, mk(a[y], c[y])));
  35.         g[y].pb(mk(x, mk(a[x], c[x])));
  36.     }
  37.     fill (d + 1, d + 1 + n, inf);
  38.     set <pair<int, pair<int,string>>> mn;
  39.     int start = 1;
  40.     d[start] = 0;
  41.     mn.insert(mk(d[start], mk(start,"")));
  42.     while (!mn.empty()) {
  43.         int v = (mn.begin() -> second).first;
  44.         mn.erase(mn.begin());
  45.         for (int i = 0; i < g[v].size(); i++) {
  46.             int to = g[v][i].first;
  47.             int w = g[v][i].second.first;
  48.             string l = g[v][i].second.second;
  49.             if (d[to] >= d[v] + w) {
  50.                 if (d[to] > d[v] + w) {
  51.                     mn.erase(mk(d[to],mk(to,c[to])));
  52.                     d[to] = d[v] + w;
  53.                     mn.insert(mk(d[to], mk(to, c[v])));
  54.                     pr[to] = v;
  55.                 } else {
  56.                     if (c[to] > c[v]) {
  57.                     mn.erase(mk(d[to],mk(to,c[to])));
  58.                     d[to] = d[v] + w;
  59.                     mn.insert(mk(d[to], mk(to, c[v])));
  60.                     pr[to] = v;
  61.                     }
  62.                 }
  63.             }
  64.         }
  65.     }
  66.     vector <int> ans;
  67.     int p = n;
  68.     while (p != 1) {
  69.         ans.push_back(p);
  70.         p = pr[p];
  71.     }
  72.     ans.push_back(1);
  73.     reverse(ans.begin(), ans.end());
  74.     cout << ans.size() << "\n";
  75.     for (int x : ans) {
  76.         cout << x << ' ';
  77.     }
  78.     return 0;
  79. }#incl
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement