Cod sursa(job #581648)

Utilizator mihai995mihai995 mihai995 Data 14 aprilie 2011 14:31:09
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
using namespace std;

const int N=10001;
int cap[N][N],flux[N][N],ind[N][N],r[10*N],T[N],v[N],n;
bool okay[N][N],use[N];

ifstream in("critice.in");
ofstream out("critice.out");

inline void sch(int &a,int &b)
{
	int c=a;a=b;b=c;
}

bool bfs(int X,int Y)
{
	int x,y,st=0,dr=0;
	v[++dr]=X;
	for (x=1;x<=n;x++)
	{
		use[x]=false;
		T[x]=0;
	}
	while (st<dr)
	{
		x=v[++st];
		use[x]=true;
		for (y=1;y<=n;y++)
		{
			if (!use[y] && cap[x][y]>flux[x][y])
			{
				if (y!=Y)
				{
					v[++dr]=y;
					T[y]=x;
				}
				use[y]=true;
			}
		}
	}
	return use[Y];
}

void BFS(int X,int Y)
{
	int x,y,st=0,dr=0;
	v[++dr]=X;
	for (x=1;x<=n;x++)
		use[x]=false;
	while (st<dr)
	{
		x=v[++st];
		use[x]=true;
		for (y=1;y<=n;y++)
			if (flux[x][y]>0)
			{
				if (flux[x][y]<cap[x][y])
					v[++dr]=y;
				if (flux[x][y]==cap[x][y])
					okay[x][y]=true;
			}
	}
	st=dr=0;
	sch(X,Y);
	v[++dr]=X;
	while (st<dr)
	{
		x=v[++st];
		use[x]=true;
		for (y=1;y<=n;y++)
			if (flux[y][x]>0)
			{
				if (flux[y][x]<cap[y][x])
					v[++dr]=y;
				if (flux[y][x]==cap[y][x] && okay[y][x])
					r[++r[0]]=ind[x][y];
			}
	}
}

void max_flow(int X,int Y)
{
	int M,i,j;
	while (bfs(X,Y))
		for (i=X;i<Y;i++)
		{
			M=cap[i][Y]-flux[i][Y];
			if (!M)
				continue;
			for (j=i;j>X;j=T[j])
				M=min(M,cap[T[j]][j]-flux[T[j]][j]);
			if (!M)
				continue;
			T[Y]=i;
			for (j=Y;j!=X;j=T[j])
			{
				flux[T[j]][j]+=M;
				flux[j][T[j]]-=M;
			}
		}
}

int main()
{
	int m,x,y,c;
	in>>n>>m;
	for (int i=1;i<=m;i++)
	{
		in>>x>>y>>c;
		cap[x][y]=cap[y][x]=c;
		ind[x][y]=ind[y][x]=i;
	}
	max_flow(1,n);
	BFS(1,n);
	sort(r+1,r+r[0]+1);
	for (int i=0;i<=r[0];i++)
		out<<r[i]<<"\n";
	return 0;
}