Cod sursa(job #914687)

Utilizator crushackPopescu Silviu crushack Data 14 martie 2013 12:50:07
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#define NMax 1010
#define MMax 10010
using namespace std;

const char IN[]="critice.in",OUT[]="critice.out";

struct muchie{
	int x,y;
} m[MMax];

int N,M;
int F[NMax][NMax],C[NMax][NMax],P[NMax],T[NMax];
bool b[NMax];
vector<int> ad[NMax],sol;
queue<int> qu;

bool bfs()
{
	int x,i;
	qu.push(1);
	memset(b,0,sizeof(b));
	b[1]=true;
	while (!qu.empty())
	{
		x=qu.front();qu.pop();
		if (x==N) continue;
		for (i=0;i<(int)ad[x].size();++i) if (!b[ad[x][i]] && C[x][ad[x][i]]>F[x][ad[x][i]])
		{
			b[ad[x][i]]=true;
			qu.push(ad[x][i]);
			P[ad[x][i]]=x;
		}
	}
	return b[N];
}

int flux()
{
	int i,ret=0,fmin,p;
	for(;bfs();)
	{
		for (i=0;i<(int)ad[N].size();++i) if (b[ad[N][i]] && C[ad[N][i]][N]>F[ad[N][i]][N]){

			P[N]=ad[N][i];
			fmin=C[P[N]][N]-F[P[N]][N];
			for (p=N;p!=1;p=P[p])
				fmin=min(fmin,C[P[p]][p]-F[P[p]][p]);

			if (!fmin) continue;

			for (p=N;p!=1;p=P[p])
				F[P[p]][p]+=fmin,
				F[p][P[p]]-=fmin;

			ret+=fmin;
		}
	}
	return ret;
}

void dfs(int x,int p=-1){
	int i;
	T[x]=1;
	for (i=0;i<(int)ad[x].size();++i) if (C[x][ad[x][i]]>F[x][ad[x][i]] && ad[x][i]!=p && !T[ad[x][i]])
		dfs(ad[x][i],x);
}

void dfs2(int x,int p=-1){
	int i;
	T[x]=2;
	for (i=0;i<(int)ad[x].size();++i) if (C[ad[x][i]][x]>F[ad[x][i]][x] && ad[x][i]!=p && !T[ad[x][i]])
		dfs2(ad[x][i],x);
}

int main()
{
	int i,x,y,c;
	freopen(IN,"r",stdin);
	scanf("%d%d",&N,&M);
	for (i=1;i<=M;++i)
	{
		scanf("%d%d%d",&x,&y,&c);
		ad[x].push_back(y);
		ad[y].push_back(x);
		m[i].x=x;m[i].y=y;
		C[x][y]+=c;
		C[y][x]+=c;
	}

	flux();
	dfs(1);
	dfs2(N);
	for (i=1;i<=M;++i) if (T[m[i].x]!=T[m[i].y] && T[m[i].x] && T[m[i].y])
		sol.push_back(i);

	freopen(OUT,"w",stdout);
	printf("%d\n",sol.size());
	for (i=0;i<(int)sol.size();++i) printf("%d\n",sol[i]);
	fclose(stdout);

	return 0;
}