Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4.  
  5. using namespace std;
  6.  
  7. typedef unsigned long long ull;
  8.  
  9. int INF = 2147483640;
  10.  
  11. void get_path(int i, int j, const vector<vector<int>> &next, vector<int> &path) {
  12.     int temp = i;
  13.     while (temp != j) {
  14.         path.push_back(temp);
  15.         temp = next[temp][j];
  16.     }
  17.     path.push_back(j);
  18. }
  19.  
  20. int main() {
  21.     int n, m, c;
  22.     cin >> n >> m >> c;
  23.     map<pair<int, int>, int> e;
  24.     vector<vector<int>> g(n, vector<int>(n, INF));
  25.     vector<vector<int>> next(n, vector<int>(n, 0));
  26.     for (int i = 0; i < n; ++i) {
  27.         for (int j = 0; j < n; ++j) {
  28.                 next[i][j] = j;
  29.         }
  30.     }
  31.     for (int i = 0; i < m; ++i) {
  32.         int f, s;
  33.         cin >> f >> s;
  34.         f--;
  35.         s--;
  36.         int w;
  37.         cin >> w;
  38.         g[f][s] = -w;
  39.         next[f][s] = s;
  40.         e[make_pair(f, s)] = i + 1;
  41.     }
  42.  
  43.     for (int k = 0; k < n; ++k) {
  44.         for (int i = 0; i < n; ++i) {
  45.             for (int j = 0; j < n; ++j) {
  46.                 if (g[i][k] < INF && g[k][j] < INF) {
  47.                     if (g[i][k] + g[k][j] < g[i][j]) {
  48.                         g[i][j] = g[i][k] + g[k][j];
  49.                         next[i][j] = next[i][k];
  50.                     }
  51.                 }
  52.             }
  53.         }
  54.     }
  55.     int from, to;
  56.     cin >> from;
  57.     cin >> to;
  58.     from--;
  59.     to--;
  60.     if (g[from][from] < 0) {
  61.         cout << "infinitely kind";
  62.         return 0;
  63.     }
  64.     vector<int> path;
  65.     path.push_back(from);
  66.     for (int i = 1; i < c; ++i) {
  67.         vector<int> path_temp;
  68.         get_path(from, to, next, path_temp);
  69.         for (int j = 0; j < path_temp.size(); ++j) {
  70.             if (g[path_temp[j]][path_temp[j]] < 0) {
  71.                 cout << "infinitely kind";
  72.                 return 0;
  73.             }
  74.         }
  75.         path.insert(
  76.                 path.end(),
  77.                 std::make_move_iterator(path_temp.begin() + 1),
  78.                 std::make_move_iterator(path_temp.end()));
  79.         from = to;
  80.         if (i != c - 1) {
  81.             cin >> to;
  82.             to--;
  83.         }
  84.     }
  85.     cout << path.size() - 1 << '\n';
  86.     for (auto i = 0; i < path.size() - 1; i++) {
  87.         cout << e[make_pair(path[i], path[i + 1])] << ' ';
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement