Cod sursa(job #751308)

Utilizator loginLogin Iustin Anca login Data 25 mai 2012 16:27:03
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
# include <fstream>
# include <iostream>
# include <vector>
# include <algorithm>
# include <queue>
# define DIM 1003
# define INF 2000000000
# define pb push_back
# define mp make_pair
# define fs first
# define sc second
using namespace std;
int n, m, c[DIM][DIM], index[DIM][DIM], v[DIM], t[DIM];
vector<int>G[DIM], R;
vector< pair<int,int> >L;

void read ()
{
	ifstream fin ("critice.in");
	fin>>n>>m;
	for(int i=1;i<=m;++i)
	{
		int x, y, z;
		fin>>x>>y>>z;
		G[x].pb(y);
		G[y].pb(x);
		c[x][y]=c[y][x]=z;
		index[x][y]=index[y][x]=i;
	}
}

int bfs (int s, int f)
{
	queue<int>Q;
	for(int i=1;i<=n;++i)
		v[i]=0, t[i]=0;
	Q.push(s);
	int k;
	while(Q.size())
	{
		k=Q.front();Q.pop();
		if (!v[k])
		{
			v[k]=1;
			for(vector<int>::iterator I=G[k].begin();I!=G[k].end();++I)
				if (!v[*I] && c[k][*I])
				{
					t[*I]=k;
					if (*I==f)return 1;
					Q.push(*I);
				}
		}
	}
	return 0;
}

void EK ()
{
	int cmin;
	while(bfs(1,n))
	{
		cmin=INF;
		for(int i=n;t[i];i=t[i])
			cmin=min(cmin,c[i][t[i]]);
		for(int i=n;t[i];i=t[i])
		{
			c[i][t[i]]-=cmin;
			c[t[i]][i]-=cmin;
			if (!c[i][t[i]])
				L.pb(mp(t[i],i));
		}
	}
}

void comp ()
{
	for(vector< pair<int,int> >::iterator I=L.begin();I!=L.end();++I)
	{
		int i=I->fs, j=I->sc;
		if ((i==1 || bfs(i,1)) && (j==n || bfs(j,n)))
			R.pb(index[i][j]);
	}
	sort(R.begin(),R.end());
}

int main ()
{
	read ();
	EK ();
	comp ();
	ofstream fout ("critice.out");
	fout<<R.size()<<"\n";
	for(vector<int>::iterator I=R.begin();I!=R.end();++I)
		fout<<*I<<"\n";
	return 0;
}