Cod sursa(job #234837)

Utilizator AndreyPAndrei Poenaru AndreyP Data 22 decembrie 2008 00:59:36
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define N 1005
#define pb push_back
struct muchie
{
	int x,y;
};
int a[N][N],cate[N],c[N][N],n,m,t[N];
muchie mu[10010];
bool v1[N],vn[N];
void citire()
{
	scanf("%d%d",&n,&m);
	int x,y,z;
	for(int i=0; i<m; i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		a[y][++cate[y]]=mu[i].x=x;
		a[x][++cate[x]]=mu[i].y=y;
		c[x][y]=c[y][x]=z;
	}
}
bool flux()
{
	memset(t,0,sizeof(t));
	bool viz[N]={0};
	viz[1]=true;
	queue<int> q;
	q.push(1);
	int nod,nod1;
	t[1]=-1;
	while(!q.empty())
	{
		nod=q.front();
		q.pop();
		for(int i=1; i<=cate[nod]; i++)
		{
			nod1=a[nod][i];
			if(!viz[nod1] && c[nod][nod1]>0)
			{
				t[nod1]=nod;
				viz[nod1]=true;
				if(nod1==n)
					return true;
				q.push(nod1);
			}
		}
	}
	return false;
}
void bfs1()
{
	queue<int> q;
	q.push(1);
	v1[1]=true;
	while(!q.empty())
	{
		int nod=q.front();
		q.pop();
		for(int i=1; i<=cate[nod]; i++)
		{
			int nod1=a[nod][i];
			if(!v1[nod1] && c[nod][nod1])
			{
				v1[nod1]=true;
				q.push(nod1);
			}
		}
	}
}
void bfsn()
{
	queue<int> q;
	q.push(n);
	vn[n]=true;
	while(!q.empty())
	{
		int nod=q.front();
		q.pop();
		for(int i=1; i<=cate[nod]; i++)
		{
			int nod1=a[nod][i];
			if(!vn[nod1] && c[nod][nod1])
			{
				vn[nod1]=true;
				q.push(nod1);
			}
		}
	}
}
int main()
{
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	citire();
	while(flux())
	{
		int r=1<<30,i=n;
		while(i!=1)
		{
			r=min(r,c[t[i]][i]);
			i=t[i];
		}
		i=n;
		while(i!=1)
		{
			c[t[i]][i]-=r;
			c[i][t[i]]+=r;
			i=t[i];
		}
	}
	bfs1();
	bfsn();
	vector<int> sol;
	int rez=0;
	for(int i=0; i<m; i++)
	{
		if((v1[mu[i].x] && vn[mu[i].y] && c[mu[i].x][mu[i].y]==0) || (v1[mu[i].y] && vn[mu[i].x] && c[mu[i].y][mu[i].x]==0))
		{
			sol.pb(i+1);
			rez++;
		}
	}
	printf("%d\n",rez);
	for(int i=0; i<rez; i++)
		printf("%d\n",sol[i]);
	return 0;
}