Pagini recente » Cod sursa (job #2345820) | Cod sursa (job #1875261) | Cod sursa (job #176234) | Cod sursa (job #1951590) | Cod sursa (job #2436925)
#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'
using namespace std;
int main() {
ifstream cin("critice.in");
ofstream cout("critice.out");
int n, m; cin >> n >> m;
vector<pair<int, int>> edges; edges.reserve(m);
vector<vector<int>> adj(n), cap(n, vector<int>(n));
while (m--) {
int u, v, c; cin >> u >> v >> c; --u, --v;
adj[u].emplace_back(v);
adj[v].emplace_back(u);
cap[u][v] = c;
cap[v][u] = c;
edges.emplace_back(u, v);
}
int src = 0, snk = n - 1;
while (true) {
vector<int> q = {src};
vector<int> parent(n, -1);
for (int i = 0; i < (int)q.size(); ++i) {
int node = q[i];
for (int &x : adj[node]) {
if (cap[node][x] > 0 && parent[x] == -1) {
parent[x] = node;
q.emplace_back(x);
}
}
}
if (parent[snk] == -1) {
break;
}
int flow = (int)1e9 + 5;
int node = snk;
while (node != src) {
flow = min(flow, cap[parent[node]][node]);
node = parent[node];
}
node = snk;
while (node != src) {
cap[parent[node]][node] -= flow;
cap[node][parent[node]] += flow;
node = parent[node];
}
}
vector<bool> vis(n);
function<void(int, bool)> DFS = [&](int node, bool inv) {
vis[node] = true;
for (int &x : adj[node]) {
int from = node, to = x;
if (inv) swap(from, to);
if (cap[from][to] > 0 && !vis[x]) {
DFS(x, inv);
}
}
};
DFS(snk, 1);
auto vis_snk = vis;
fill(vis.begin(), vis.end(), false);
DFS(src, 0);
vector<int> ans;
for (int i = 0; i < (int)edges.size(); ++i) {
int u, v; tie(u, v) = edges[i];
if ((cap[u][v] == 0 && vis[u] && vis_snk[v]) || (cap[v][u] == 0 && vis[v] && vis_snk[u]))
ans.emplace_back(i + 1);
}
cout << ans.size() << endl;
for (int &x : ans) cout << x << '\n';
}