Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <queue>
  5. #include <deque>
  6. #include <stack>
  7. #include <map>
  8. #include <vector>
  9. #include <string>
  10. #include <set>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <ctime>
  14. #include <cstdlib>
  15. #include <cstring>
  16.  
  17. #define sz(a) (int)a.size()
  18. #define all(a) a.begin(), a.end()
  19. #define rall(a) a.rbegin(), a.rend()
  20. #define llong long long
  21. #define zero(a) fabs(a) < 1e-9
  22. #define resz(a, n) a.clear(), a.resize(n)
  23. #define same(a, n) memset(a, n, sizeof(a))
  24. #define make(a, b) make_pair(a, b)
  25.  
  26. using namespace std;
  27.  
  28. const int MAXN = 105;
  29. const int INF = 1000000000;
  30.  
  31. int n, m, dist[MAXN], adj[MAXN][MAXN], e[MAXN][MAXN];
  32.  
  33. vector< int > path(int s, int q) {
  34.     vector< int > ret;
  35.     while (adj[s][q] != 0) {
  36.         ret.push_back(q);
  37.         for (int i = 0; i < n; i++)
  38.             if (adj[s][q] == adj[s][i] + e[q][i]) {
  39.                 q = i;
  40.                 break;
  41.             }
  42.     }
  43.     return ret;
  44. }
  45.  
  46. int main() {
  47.     for (int t = 1; ; t++) {
  48.         scanf("%d", &n);
  49.         if (n < 0)
  50.             break;
  51.         for (int i = 0; i < n; i++) {
  52.             for (int j = i + 1; j < n; j++)
  53.                 e[i][j] = e[j][i] = adj[i][j] = adj[j][i] = INF;
  54.             e[i][i] = adj[i][i] = 0;
  55.         }
  56.         scanf("%d", &m);
  57.         for (int i = 0; i < m; i++) {
  58.             int u, v, w;
  59.             scanf("%d %d %d", &u, &v, &w);
  60.             --u, --v;
  61.             e[u][v] = e[v][u] = adj[u][v] = adj[v][u] = min(adj[u][v], w);
  62.         }
  63.         for (int k = 0; k < n; k++)
  64.             for (int i = 0; i < n; i++)
  65.                 for (int j = 0; j < n; j++)
  66.                     adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j]);
  67.         int ans = INF, x, y, z;
  68.         for (int i = 0; i < n; i++)
  69.             for (int j = 0; j < n; j++)
  70.                 for (int k = j + 1; k < n; k++)
  71.                     if (adj[i][j] != adj[i][k] + e[j][k] && adj[i][k] != adj[i][j] + e[j][k]) {
  72.                         if (adj[i][j] + adj[i][k] + e[j][k] < ans) {
  73.                             ans = adj[i][j] + adj[i][k] + e[j][k];
  74.                             x = j, y = k, z = i;
  75.                         }
  76.                     }
  77.         if (ans == INF)
  78.             printf("No solution.\n");
  79.         else {
  80.             vector< int > ret = path(z, x), q = path(z, y);
  81.             ret.push_back(z);
  82.             for (int j = sz(q) - 1; j >= 0; j--)
  83.                 ret.push_back(q[j]);
  84.             printf("%d", ret[0] + 1);
  85.             for (int i = 1; i < sz(ret); i++)
  86.                 printf(" %d", ret[i] + 1);
  87.             printf("\n");
  88.         }
  89.     }
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement