Cod sursa(job #428223)

Utilizator otilia_sOtilia Stretcu otilia_s Data 29 martie 2010 00:02:03
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 1004
#define MMAX 10002
#define oo 10005
vector < pair<int,int> > M;
vector <int> A[NMAX];
int nm,n,m;
bool vb[NMAX][2];
int viz[NMAX],C[NMAX][NMAX],F[NMAX][NMAX],nv[NMAX],Q[NMAX],sol[MMAX];

void citire()
{ int i;
	freopen("critice.in","r",stdin);
	scanf("%d %d",&n,&m);
	for (i=1;i<=m;++i)
	{ int x,y,ct;
		scanf("%d %d %d",&x,&y,&ct);
		M.push_back( make_pair(x,y) );
		C[x][y]=C[y][x]=ct;
		A[x].push_back(y); nv[x]++;
		A[y].push_back(x); nv[y]++;
	}	
}

bool bfs()
{
	int st,dr,x,i;
	st=dr=0; Q[0]=1;
	while (st<=dr)
	{
		x=Q[st++];
		if (x==n) continue;
		
		for (i=0;i<nv[x];++i)
		 if (!viz[A[x][i]] && C[x][A[x][i]]>F[x][A[x][i]])
		    {
				viz[A[x][i]]=x;
				Q[++dr]=A[x][i];
		    }
	}
	
	return viz[n];
}

void Flux()
{ int i,j;
	memset(viz,0,sizeof(viz));
	while (bfs())
	{
		for (i=0;i<nv[n];++i)
		 if (F[A[n][i]][n]<C[A[n][i]][n] && viz[A[n][i]])
			{
			  viz[n]=A[n][i];
			  int flux=oo;
			  
			  for (j=n;j>1;j=viz[j])
			   flux=min(flux,C[viz[j]][j]-F[viz[j]][j]);
			  
			  for (j=n;j>1;j=viz[j])
			   {
				   F[viz[j]][j]+=flux;
				   F[j][viz[j]]-=flux;
			   }
			}
		
		memset(viz,0,sizeof(viz));
	}	
}

void bf(int s, int d, short v)
{
	int st,dr,i,x;
	st=dr=0; Q[0]=s; vb[s][v]=1;
	while (st<=dr)
	{
		x=Q[st++];
		if (x==d) continue;
		for (i=0;i<nv[x];++i)
		 if (!vb[A[x][i]][v] && C[x][A[x][i]]>F[x][A[x][i]] && C[A[x][i]][x]>F[A[x][i]][x])
			{
			 vb[A[x][i]][v]=1;
			 Q[++dr]=A[x][i];
			}
	}	
}

void afisare()
{
	freopen("critice.out","w",stdout);	
	printf("%d\n",nm);
	int i;
	for (i=1;i<=nm;++i)
	 printf("%d\n",sol[i]);
}

int main()
{
	citire();
	Flux();
	
	memset(vb,0,sizeof(vb));	
	bf(1,n,0);
	bf(n,1,1);
	int i,x,y;
	nm=0; 
	for (i=0;i<m;++i)
	{
		x=M[i].first; y=M[i].second;
		if ( F[x][y]==C[x][y])		
		  if ((vb[x][0]&&!vb[x][1]) && (vb[y][1]&&!vb[y][0]) )
			{ sol[++nm]=i+1; continue;}
		if (F[y][x]==C[y][x])
		 if ((vb[y][0]&&!vb[y][1]) && (vb[x][1]&&!vb[x][0]) )
			{ sol[++nm]=i+1;}
	}
	
	afisare();
	
	return 0;
}