Cod sursa(job #915125)

Utilizator dragangabrielDragan Andrei Gabriel dragangabriel Data 14 martie 2013 19:06:47
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<deque>
#define nmax 1005
using namespace std;
int n,i,j,k,mat[nmax][nmax],x,y,m,din[nmax],rez;
struct nod {int n1;int n2;}s[nmax*10];
deque<int>c;
vector<int>v[nmax];

bool df(int x)
{
	c.push_back(x);
	while (!c.empty())
	{
		x=c.front();c.pop_front();
		for (j=0;j<v[x].size();j++) if (mat[x][v[x][j]] && !din[v[x][j]])
			din[v[x][j]]=x,c.push_back(v[x][j]);
	}
	if (!din[n]) return false;
	return true;
}

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,&k);
		v[x].push_back(y);
		v[y].push_back(x);
		mat[x][y]+=k;
		s[i].n1=x;
		s[i].n2=y;
	}
	while (df(1))
	{
		x=n;y=2000000000;
		for (i=n;i>1;i=din[i])
			y=min(y,mat[din[i]][i]);
		for (i=n;i>1;i=din[i])
			mat[din[i]][i]-=y,mat[i][din[i]]+=y;
		rez=rez+y;
		memset(din,0,sizeof(din));
	}
	rez=0;
	for (i=1;i<=m;i++) if (!mat[s[i].n1][s[i].n2]) din[++rez]=i;
	printf("%d\n",rez);
	for (i=1;i<=rez;i++) printf("%d\n",din[i]);
	return 0;
}