Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <map>
- using namespace std;
- typedef unsigned long long ull;
- int INF = 2147483640;
- void get_path(int i, int j, const vector<vector<int>> &next, vector<int> &path) {
- int temp = i;
- while (temp != j) {
- path.push_back(temp);
- temp = next[temp][j];
- }
- path.push_back(j);
- }
- int main() {
- int n, m, c;
- cin >> n >> m >> c;
- map<pair<int, int>, int> e;
- vector<vector<int>> g(n, vector<int>(n, INF));
- vector<vector<int>> next(n, vector<int>(n, 0));
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < n; ++j) {
- next[i][j] = j;
- }
- }
- for (int i = 0; i < m; ++i) {
- int f, s;
- cin >> f >> s;
- f--;
- s--;
- int w;
- cin >> w;
- g[f][s] = -w;
- next[f][s] = s;
- e[make_pair(f, s)] = i + 1;
- }
- for (int k = 0; k < n; ++k) {
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < n; ++j) {
- if (g[i][k] < INF && g[k][j] < INF) {
- if (g[i][k] + g[k][j] < g[i][j]) {
- g[i][j] = g[i][k] + g[k][j];
- next[i][j] = next[i][k];
- }
- }
- }
- }
- }
- int from, to;
- cin >> from;
- cin >> to;
- from--;
- to--;
- if (g[from][from] < 0) {
- cout << "infinitely kind";
- return 0;
- }
- vector<int> path;
- path.push_back(from);
- for (int i = 1; i < c; ++i) {
- vector<int> path_temp;
- get_path(from, to, next, path_temp);
- for (int j = 0; j < path_temp.size(); ++j) {
- if (g[path_temp[j]][path_temp[j]] < 0) {
- cout << "infinitely kind";
- return 0;
- }
- }
- path.insert(
- path.end(),
- std::make_move_iterator(path_temp.begin() + 1),
- std::make_move_iterator(path_temp.end()));
- from = to;
- if (i != c - 1) {
- cin >> to;
- to--;
- }
- }
- cout << path.size() - 1 << '\n';
- for (auto i = 0; i < path.size() - 1; i++) {
- cout << e[make_pair(path[i], path[i + 1])] << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement