Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- const int N = 1e6;
- struct Edge{
- int dst, f, c;
- };
- vector <Edge> e;
- int s = 1, n;
- //e1, e1
- //(e[i])' = e[i ^ 1]
- vector <int> g[N];
- bool used[N];
- //g[i] - список ребер исходящих из v
- int dfs(int v, int minn) {
- //cout << v << endl;
- if (used[v]) return 0;
- used[v] = true;
- if (v == n) return minn;
- for (auto i : g[v]) {
- if (e[i].f == e[i].c) continue;
- int delta = dfs(e[i].dst, min(minn, e[i].c - e[i].f));
- if (delta > 0) {
- e[i].f += delta;
- e[(i ^ 1)].f -= delta;
- return delta;
- }
- }
- return 0;
- }
- signed main() {
- int m;
- cin >> n >> m;
- for (int i = 0; i < m * 2; i+= 2) {
- Edge kek, kek1;
- int l, r, c;
- cin >> l >> r >> c;
- g[l].push_back(i);
- g[r].push_back(i + 1);
- kek.f = 0; kek.dst = r;
- e.push_back({r, 0, c});
- e.push_back({l, 0, c});
- }
- int F = 0;
- while (true) {
- fill(used, used + n + 5, false);
- int delta = dfs(s, INT_MAX);
- if (delta == 0) {
- break;
- }
- F += delta;
- }
- vector <int> ans;
- set <pair <int, int>> s;
- for (int i = 1; i <= n; i++) {
- for (auto to : g[i]) {
- int j = e[to].dst;
- if (abs(e[to].f) == e[to].c && s.find({i, j}) == s.end() && used[i] != used[j]) {
- //cout << e[to].f << ' ' << e[to].c << endl;
- s.insert({i, j}); s.insert({j, i});
- ans.push_back(to / 2);
- }
- }
- }
- cout << ans.size() << ' ' << F << "\n";
- for (auto to : ans) cout << to + 1 << ' ';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement