DuongNhi99

DULICH

Dec 1st, 2020 (edited)
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4.  
  5. const int N = 101;
  6. const int oo = 1e9 + 7;
  7.  
  8. typedef pair<ll, int> ii;
  9.  
  10. int n, m;
  11. vector<int> a[N];
  12. ll cost[N][N];
  13.  
  14. ll parent[N], d[N];
  15.  
  16. void dijkstra(int s) {
  17.     priority_queue<ii, vector<ii>, greater<ii>> pq;
  18.  
  19.     fill(d + 1, d + 1 + n, 1e9);
  20.     d[s] = 0;
  21.     pq.push({0, s});
  22.  
  23.     while(!pq.empty()) {
  24.         int u = pq.top().second;
  25.         int du = pq.top().first;
  26.         pq.pop();
  27.  
  28.         if(du != d[u]) continue;
  29.  
  30.         for(int i = 0; i < a[u].size() ;i++) {
  31.             int v = a[u][i];
  32.             int uv = cost[u][v];
  33.  
  34.             if(d[v] > d[u] + uv) {
  35.                 d[v] = d[u] + uv;
  36.                 pq.push({d[v], v});
  37.                 parent[v] = u;
  38.             }
  39.         }
  40.     }
  41. }
  42.  
  43. void Print(int s, int t, int mid) {
  44.     ll dem = 1;
  45.     vector<int> res;
  46.  
  47.     int u = mid, v = s;
  48.     while(u != v) {
  49.         dem++;
  50.         res.push_back(v);
  51.         v = parent[v];
  52.     }
  53.  
  54.     res.push_back(mid);
  55.  
  56.     u = mid, v = t;
  57.     while(u != v) {
  58.         dem++;
  59.         res.push_back(v);
  60.         v = parent[v];
  61.     }
  62.  
  63.     cout << dem << '\n';
  64.     for(int i = 0; i < res.size(); ++i)
  65.         cout << res[i] << ' ';
  66. }
  67.  
  68. int main()
  69. {
  70.     //freopen("in.txt", "r", stdin);
  71.     freopen("DULICH.inp", "r", stdin);
  72.     freopen("DULICH.out", "w", stdout);
  73.     ios_base::sync_with_stdio(false);
  74.     cin.tie(NULL); cout.tie(NULL);
  75.  
  76.     cin >> n >> m;
  77.  
  78.     memset(cost, oo, sizeof(cost));
  79.     for(int i = 1; i <= m; i++) {
  80.         int u, v, w; cin >> u >> v >> w;
  81.         a[u].push_back(v);
  82.         a[v].push_back(u);
  83.  
  84.         cost[u][v] = min(cost[u][v], (ll)w);
  85.         cost[v][u] = cost[u][v];
  86.     }
  87.  
  88.     ll ans = oo;
  89.     ll mid = -1, s = -1, t = -1;
  90.     for(int i = 1; i <= n; i++) {
  91.         fill(parent + 1, parent + n + 1, 0);
  92.  
  93.         dijkstra(i);
  94.         for(int u = 1; u <= n; u++)
  95.             for(int v = u + 1; v <= n; v++)
  96.                 if(parent[v] != u && parent[u] != v) {
  97.                     if(ans >= d[u] + d[v] + cost[u][v]) {
  98.                         ans = d[u] + d[v] + cost[u][v];
  99.                         mid = i, s = u, t = v;
  100.                     }
  101.                 }
  102.     }
  103.  
  104.     if(ans == oo)
  105.         cout << 0 << '\n';
  106.     else {
  107.         cout << 1 << '\n';
  108.         cout << ans << '\n';
  109.  
  110.         fill(parent + 1, parent + n + 1, 0);
  111.         dijkstra(mid);
  112.  
  113.         Print(s, t, mid) ;
  114.     }
  115. }
  116.  
Advertisement
Add Comment
Please, Sign In to add comment