Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int M = 409;
- const int N = 109;
- const ll INF = (ll)1e18;
- struct edge {
- int v, u;
- ll w;
- edge() {
- v = 0;
- u = 0;
- w = 0;
- }
- edge(int v, int u, ll w) : v(v), u(u), w(w) {}
- };
- int n, m;
- edge e[M * 2 + 100];
- ll ans[M * 2 + 100];
- vector <pair<ll, int>> g[N];
- bool used[N];
- ll dfs(int v, ll minW) {
- used[v] = true;
- if (v == n - 1) {
- return minW;
- }
- for (auto x : g[v]) {
- ll sign = x.first;
- auto vu_edge = e[x.second];
- int u = vu_edge.u;
- ll w = vu_edge.w - abs(ans[x.second]);
- if (used[u])
- continue;
- if (w == 0)
- continue;
- ll ret = dfs(u, min(minW, w));
- if (ret != 0) {
- ans[x.second] += ret * sign;
- return ret;
- }
- }
- return 0;
- }
- set <int> minCut;
- void findMinCut(int v) {
- used[v] = true;
- for (auto x : g[v]) {
- ll sign = x.first;
- auto vu_edge = e[x.second];
- int u = vu_edge.u;
- ll w = ans[x.second % m] + ans[x.second % m + m];
- w *= sign;
- //cout << v + 1 << " -> " << u + 1 << " | " << w << " ~ " << vu_edge.w << "\n";
- if (used[u])
- continue;
- if (w == vu_edge.w)
- continue;
- findMinCut(u);
- }
- }
- int main() {
- //freopen("out.txt", "r", stdin);
- cin >> n >> m;
- int a, b;
- ll c;
- for (int i = 0; i < m; i++) {
- cin >> a >> b >> c;
- a--;
- b--;
- e[i] = edge(a, b, c);
- e[i + m] = edge(b, a, c);
- g[a].push_back({1, i});
- g[b].push_back({-1, i + m});
- }
- while(dfs(0, INF) != 0) {
- fill(used, used + N, false);
- }
- ll maxFlow = 0;
- for (auto x : g[0]) {
- maxFlow += abs(ans[x.second]);
- }
- fill(used, used + N, false);
- findMinCut(0);
- for (int i = 0; i < n; i++) {
- if (!used[i])
- continue;
- for (auto x : g[i]) {
- if (used[e[x.second].u])
- continue;
- /*
- if ((ans[x.second % m] + ans[x.second % m + m]) * x.first <= 0)
- continue;
- */
- minCut.insert(x.second % m);
- }
- }
- cout << minCut.size() << " " << maxFlow << "\n";
- for (int x : minCut) {
- cout << x + 1 << " ";
- }
- return 0;
- }
- /*
- 7 8
- 1 2 3
- 1 3 2
- 4 3 2
- 2 4 3
- 4 5 2
- 6 4 3
- 7 6 2
- 7 5 3
- 4 5
- 1 2 10000000
- 3 1 1
- 3 2 10000
- 3 4 100000
- 4 2 100000
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement