Pagini recente » Cod sursa (job #3209730) | Cod sursa (job #2351488) | Cod sursa (job #622399) | Cod sursa (job #197816) | Cod sursa (job #2447192)
#include <bits/stdc++.h>
#define inf 2147483647
using namespace std;
int n, m, i, j, k;
int cmax[1001][1001], flow[1001][1001], last[1001];
bool vis[1001];
vector<int> graph[1001], sol;
vector<pair<int, int> > edges;
queue<int> q;
void read();
void solve();
void write();
bool bfs();
void dfs(int node);
int main()
{
read();
solve();
write();
return 0;
}
void read(){
freopen("critice.in", "r", stdin);
scanf("%d%d", &n, &m);
for(i=1; i<=m; ++i){
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
graph[x].push_back(y);
graph[y].push_back(x);
edges.push_back({x, y});
cmax[x][y]=cmax[y][x]=c;
}
return;
}
void solve(){
while(bfs()){
for(auto node:graph[n]){
if(!vis[node] || flow[node][n]==cmax[node][n]) continue;
last[n]=node;
int parc, newflow=inf;
for(parc=n; parc!=1; parc=last[parc]) newflow=min(newflow, cmax[last[parc]][parc]-flow[last[parc]][parc]);
if(!newflow) continue;
for(parc=n; parc!=1; parc=last[parc]){
flow[last[parc]][parc]+=newflow;
flow[parc][last[parc]]-=newflow;
}
}
}
for(i=1; i<=n; ++i) vis[i]=false;
dfs(1);
for(i=0; i<edges.size(); ++i) if(vis[edges[i].first]!=vis[edges[i].second]) sol.push_back(i+1);
return;
}
void write(){
freopen("critice.out", "w", stdout);
printf("%d\n", int(sol.size()));
for(auto i:sol) printf("%d\n", i);
return;
}
bool bfs(){
for(i=1; i<=n; ++i) last[i]=0, vis[i]=false;
q.push(1); vis[1]=true;
while(!q.empty()){
int node=q.front(); q.pop();
if(node==n) continue;
for(auto next:graph[node]){
if(vis[next] || flow[node][next]==cmax[node][next]) continue;
q.push(next); vis[next]=true; last[next]=node;
}
}
return vis[n];
}
void dfs(int node){
vis[node]=true;
for(auto next:graph[node]) {
if(vis[next] || flow[node][next]==cmax[node][next]) continue;
dfs(next);
}
return;
}