Pagini recente » Cod sursa (job #1510853) | Cod sursa (job #2272115) | Cod sursa (job #1719305) | Cod sursa (job #1256174) | Cod sursa (job #252543)
Cod sursa(job #252543)
#include <stdio.h>
#include <bitset>
#define INF 2147000000
using namespace std;
struct muchie{int x,y;}a[10005];
int n,m,M,i,j,x,y,z,flux,aux,minim,nod;
int g[1024],t[1024],path[1024],cap[1005][1024],f[1005][1024],sol[10005],st[1005];
int * v[1005];
bitset<1024>mark;
bool BFS(){
int i,nod,fiu,p=1,q=1,que[1024];
mark.reset();
que[1]=1;mark[1]=1;
while (p<=q){
nod=que[p];
for (i=0;i<g[nod];++i){
fiu=v[nod][i];
if (!mark[fiu])
if (f[nod][fiu]<cap[nod][fiu] && cap[nod][fiu]){
que[++q]=fiu;t[fiu]=nod;mark[fiu]=1;
}
}
p++;
}
return mark[n];
}
bool cauta(int x, int y){
st[1]=x;int i,p=1,q=1,nod,fiu;
mark.reset();mark[x]=1;
while (p<=q){
nod=st[p];
for (i=0;i<g[nod];++i){
fiu=v[nod][i];
if (!mark[fiu])
if (f[nod][fiu]<cap[nod][fiu] ){
st[++q]=fiu;
mark[fiu]=1;
}
}
p++;
}
return mark[y];
}
int main(){
freopen("critice.in","r",stdin);freopen("critice.out","w",stdout);
scanf("%d %d",&n,&M);
for (i=1;i<=M;++i){
scanf("%d %d %d",&x,&y,&z);
g[x]++; g[y]++; cap[x][y]=z; cap[y][x]=z;
a[i].x=x; a[i].y=y;
}
for (i=1;i<=n;++i)v[i]=(int*)malloc(g[i]*sizeof(int)),g[i]=0;
for (i=1;i<=M;++i){ x=a[i].x; y=a[i].y; v[x][g[x]++]=y; v[y][g[y]++]=x;}
//////////////
flux=0;
do{
if ( !BFS() )break;
for (i=0; i<g[n]; ++i){
nod=v[n][i];
if (f[nod][n]>=cap[nod][n] || !mark[nod] )continue;
m=0; aux=n; minim=INF;
while (aux){path[++m]=aux;aux=t[aux];}
for (j=1;j<m;++j)
if (minim > cap[path[j+1]][path[j]]-f[path[j+1]][path[j]] )
minim=cap[path[j+1]][path[j]]-f[path[j+1]][path[j]];
for (j=1;j<m;++j){
f[path[j+1]][path[j]]+=minim;
f[path[j]][path[j+1]]-=minim;
}
flux+=minim;
}
}while (1);
m=0;
for (i=1;i<=M;++i){
x=a[i].x;y=a[i].y;
if (f[x][y]>=cap[x][y])
if ( cauta(1,x) )
if ( cauta (y,n) )sol[++m]=i;
}
printf("%d\n",m);
for (i=1;i<=m;++i)printf("%d\n",sol[i]);
return 0;
}