Pagini recente » Cod sursa (job #1482684) | Cod sursa (job #1280844) | Cod sursa (job #3120989) | Cod sursa (job #2585330) | Cod sursa (job #1666217)
#include <bits/stdc++.h>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
const int N = 1005;
int flow[N][N], cap[N][N], f[N], n, m;
bool vis[N], access[2][N];
vector<int> g[N], sol;
vector<pair<int,int>> edge;
queue<int> q;
bool bfs() {
memset(vis, 0, sizeof(vis));
vis[1] = 1;
q.push(1);
while (!q.empty()) {
int cur = q.front();
q.pop();
if (cur == n) continue;
for(auto nxt : g[cur]) {
if(!vis[nxt] && flow[cur][nxt] < cap[cur][nxt]) {
f[nxt] = cur;
vis[nxt] = 1;
q.push(nxt);
}
}
}
return vis[n];
}
void dfs(bool use[], int cur) {
use[cur] = 1;
for(int nxt : g[cur]) {
if(!use[nxt] && flow[cur][nxt] != cap[cur][nxt] && flow[nxt][cur] != cap[nxt][cur]) {
dfs(use, nxt);
}
}
}
int main() {
int i, a, b, c, fmin;
in >> n >> m;
for (i = 1; i <= m; i++) {
in >> a >> b >> c;
g[a].push_back(b);
g[b].push_back(a);
cap[a][b] = cap[b][a] = c;
edge.push_back(make_pair(a, b));
}
while (bfs()) {
for (auto start : g[n]) {
if(vis[start]) {
f[n] = start;
fmin = 1e9;
for (i = n; i != 1; i = f[i]) {
fmin = min(fmin, cap[f[i]][i] - flow[f[i]][i]);
}
for (i = n; i != 1; i = f[i]) {
flow[f[i]][i] += fmin;
flow[i][f[i]] -= fmin;
}
}
}
}
dfs(access[0], 1);
dfs(access[1], n);
for (i = 0; i < edge.size(); i++) {
a = edge[i].first;
b = edge[i].second;
if ((access[0][a] && access[1][b]) || (access[1][a] && access[0][b])) {
sol.push_back(i + 1);
}
}
out << sol.size() << '\n';
for(int i : sol) out << i << '\n';
return 0;
}