Pagini recente » Cod sursa (job #605161) | Cod sursa (job #1692217) | Cod sursa (job #2214035) | Cod sursa (job #151786) | Cod sursa (job #2286785)
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
vector<int>g[1005];
int cap[1005][1005];
struct ed{
int x,y;
}edge[10005];
int rasp[10005];
int last[1005];
queue<int>q;
int n;
int bfs(){
int i,nod;
while(!q.empty())
q.pop();
q.push(1);
for(i=1;i<=n;i++)
last[i]=0;
while(!q.empty()){
nod=q.front();
q.pop();
for(auto it:g[nod])
if (last[it]==0 && cap[nod][it]>0){
q.push(it);
last[it]=nod;
if (it==n)
return 1;}}
return 0;}
int a[1005],b[1005];
int caut(int fir,int v[]){
while(!q.empty())
q.pop();
q.push(fir);
v[fir]=1;
int nod;
while(!q.empty()){
nod=q.front();
q.pop();
for(auto it:g[nod])
if (v[it]==0 && cap[nod][it]>0 && cap[it][nod]){
q.push(it);
v[it]=1;}}}
int main(){
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
int m,i,x,y,k,c,minim;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&c);
g[x].push_back(y);
g[y].push_back(x);
cap[x][y]=c;
cap[y][x]=c;
edge[i].x=x;
edge[i].y=y;}
while(bfs()){
k=n;
minim=2e9;
while(k!=1){
minim=min(minim,cap[last[k]][k]);
k=last[k];}
k=n;
while(k!=1){
cap[last[k]][k]-=minim;
cap[k][last[k]]+=minim;
k=last[k];}}
caut(1,a);
caut(n,b);
int rasp2=0;
for(i=1;i<=m;i++)
if (a[edge[i].x] && b[edge[i].y] || a[edge[i].y] && b[edge[i].x])
rasp[++rasp2]=i;
printf("%d\n",rasp2);
for(i=1;i<=rasp2;i++)
printf("%d\n",rasp[i]);
return 0;}