Pagini recente » Cod sursa (job #1465270) | Cod sursa (job #2434578) | Cod sursa (job #2133369) | Cod sursa (job #898368) | Cod sursa (job #2695790)
#include<bits/stdc++.h>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
#define INF 1005
int n, m;
vector<vector<int>> residual;
vector<bool> viz;
vector<vector<int>> v;
vector<int> path;
vector<pair<int,int>> muchii;
bool bfs(){
queue<int> q;
for(auto &p: path)
p = 0;
q.emplace(1);
path[1] = -1;
while(!q.empty() && !path[n]){
int current = q.front();
q.pop();
if(current==n) continue;
for(auto &node: v[current])
if(residual[current][node] && !path[node]){
path[node] = current;
q.emplace(node);
}
}
return path[n] != 0;
}
void edmonds_karp(){
path.resize(n+1, 0);
while(bfs()){
for(auto &node: v[n])
if(path[node]!=0 && residual[node][n]){
int current = n;
path[current] = node;
int flow = INF;
while(path[current]!=-1){
flow = min(flow, residual[path[current]][current]);
current = path[current];
}
if(!flow) continue;
current = n;
while(path[current]!=-1){
residual[path[current]][current] -= flow;
residual[current][path[current]] += flow;
current = path[current];
}
}
}
}
void dfs(int node1){
viz[node1] = true;
for(auto &node2: v[node1])
if(!viz[node2] && residual[node1][node2])
dfs(node2);
}
int main() {
f>>n>>m;
residual.resize(n+1, vector<int>(n+1, 0));
v.resize(n+1);
while(m--){
int x, y, c;
f>>x>>y>>c;
v[x].emplace_back(y);
v[y].emplace_back(x);
residual[x][y] = c;
residual[y][x] = c;
muchii.emplace_back(x, y);
}
edmonds_karp();
viz.resize(n+1, false);
dfs(1);
vector<int> ans;
for(int i=0;i<muchii.size();++i)
if(viz[muchii[i].first]!=viz[muchii[i].second])
ans.emplace_back(i+1);
g<<ans.size()<<'\n';
for(auto &a: ans)
g<<a<<'\n';
return 0;
}