Cod sursa(job #252550)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 4 februarie 2009 16:28:25
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#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,in,ex;

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];
}
void cauta(){
 int i,p=1,q=1,nod,fiu;
 st[1]=1;in[1]=1;
 while (p<=q){
		nod=st[p];
		for (i=0;i<g[nod];++i){
			 fiu=v[nod][i];
			 if (!in[fiu])
			   if (f[nod][fiu]<cap[nod][fiu] ){
						st[++q]=fiu;
						in[fiu]=1;
				 }
		}
		p++;
 }
 st[1]=n;ex[n]=1;p=q=1;
 while (p<=q){
		nod=st[p];
		for (i=0;i<g[nod];++i){
			 fiu=v[nod][i];
			 if (!ex[fiu])
			   if (f[fiu][nod]<cap[fiu][nod] ){
						st[++q]=fiu;
						ex[fiu]=1;
				 }
		}
		p++;
 }
}
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);
 //////
 cauta();
 m=0;
 for (i=1;i<=M;++i){
		x=a[i].x;y=a[i].y;
		if (f[x][y]>=cap[x][y] || f[y][x]>=cap[x][y])
			if ((in[x]&&ex[y]) || (ex[x]&&in[y]))sol[++m]=i;
 }
 printf("%d\n",m);
 for (i=1;i<=m;++i)printf("%d\n",sol[i]);
return 0;
}