Cod sursa(job #709250)

Utilizator Robert29FMI Tilica Robert Robert29 Data 7 martie 2012 21:03:42
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<stdio.h>
#include<vector>
using namespace std;
FILE*f=fopen("critice.in","r");
FILE*g=fopen("critice.out","w");
int m,n,nr,x,y,z,minn,p,u,ok1,ok2,ok3,ok4,c[1001][1001],F[1001][1001],sol[10001],t[1001],d[1003];
char viz[1001];
struct tunele
{
	int x,y;
}M[10001];
vector <int> v[1001];
int bfs()
{
	d[1]=p=u=1;
	int ok=0;
	
	for(int i=1;i<=n;++i)
		viz[i]=0;
	while(p<=u)
	{
		int nod=d[p];
		for(int i=0;i<v[nod].size();++i)
			if(!viz[v[nod][i]]&&c[nod][v[nod][i]]-F[nod][v[nod][i]]>0)
			{
				
				t[v[nod][i]]=nod;
				d[++u]=v[nod][i];
				viz[v[nod][i]]=1;
				if(v[nod][i]==n)
					return 1;
			}
		++p;
	}
	return ok;
}
int intreg(int x)
{
	if(x<0)
		return -x;
	return x;
}
void bfs2(int nod)
{
	p=u=1;
	d[p]=nod;
	for(int i=1;i<=n;++i)
		viz[i]=0;
	if(nod==1)
		ok1=1;
	else if(nod==n)
		ok2=1;
	while(p<=u)
	{
		int nod=d[p];
		for(int i=0;i<v[nod].size();++i)
			if(!viz[v[nod][i]]&&c[nod][v[nod][i]]-intreg(F[nod][v[nod][i]])>0)
			{
				if(v[nod][i]!=n&&v[nod][i]!=1)
				{
					d[++u]=v[nod][i];
					viz[v[nod][i]]=1;
				}
				else if(v[nod][i]==n)
					ok2=1;
				else if(v[nod][i]==1)
					ok1=1;
				if(ok1&&ok2)
					return ;
			}
		++p;
	}
	
}
int main()
{
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		fscanf(f,"%d%d%d",&x,&y,&z);
		M[i].x=x;
		M[i].y=y;
		v[x].push_back (y);
		v[y].push_back (x);
		c[x][y]=c[y][x]=z;
	}
	
	while(bfs())
	{
		minn=c[t[n]][n]-F[t[n]][n];
		
		for(int nod=t[n];nod!=1;nod=t[nod])
			if(minn>c[t[nod]][nod]-F[t[nod]][nod])
				minn=c[t[nod]][nod]-F[t[nod]][nod];
			
		F[t[n]][n]+=minn;
		F[n][t[n]]-=minn;
		
		for(int nod=t[n];nod!=1;nod=t[nod])
		{
			F[t[nod]][nod]+=minn;
			F[nod][t[nod]]-=minn;
		}
	}	
	for(int ii=1;ii<=m;++ii)
		if(F[M[ii].x][M[ii].y]==c[M[ii].x][M[ii].y]||F[M[ii].y][M[ii].x]==c[M[ii].y][M[ii].x])
		{
			ok1=ok2=0;
			bfs2(M[ii].x);
			ok4=ok2;
			ok3=ok1;
			ok1=ok2=0;
			bfs2(M[ii].y);
			if((ok1&&ok4)||(ok2&&ok3))
			{
				++nr;
				sol[nr]=ii;
			}
			
		}
	
	fprintf(g,"%d\n",nr);
	for(int i=1;i<=nr;++i)
		fprintf(g,"%d\n",sol[i]);
	
	fclose(g);
	fclose(f);
	return 0;
}