Cod sursa(job #751321)

Utilizator loginLogin Iustin Anca login Data 25 mai 2012 17:13:35
Problema Critice Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
# include <fstream>
# include <iostream>
# include <vector>
# include <algorithm>
# include <queue>
# define DIM 1003
# define INF 32000
# define pb push_back
# define mp make_pair
# define fs first
# define sc second
# define sint short int
using namespace std;
sint n, m, c[DIM][DIM], t[DIM];
vector<sint>G[DIM], R;
vector< pair<sint,sint> >M;

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

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

void EK ()
{
	sint cmin;
	while(bfs(1,n))
	{
		cmin=INF;
		for(sint i=n;t[i];i=t[i])
			cmin=min(cmin,c[i][t[i]]);
		for(sint i=n;t[i];i=t[i])
		{
			c[i][t[i]]-=cmin;
			c[t[i]][i]-=cmin;
		}
	}
}

void bf (sint s, sint v[])
{
	queue<sint>Q;
	Q.push(s);
	sint k;
	while(Q.size())
	{
		k=Q.front();Q.pop();
		if (!v[k])
		{
			v[k]=1;
			for(vector<sint>::iterator I=G[k].begin();I!=G[k].end();++I)
				if (!v[*I] && c[k][*I])
					Q.push(*I);
		}
	}
}

void comp ()
{	
	sint v1[DIM], v2[DIM];
	for(sint i=1;i<=n;++i)
		v1[i]=v2[i]=0;
	bf(1, v1);
	bf(n, v2);
	for(int k=0;k<m;++k)
	{
		sint i=M[k].fs, j=M[k].sc;
		if (!c[i][j])
			if ((v1[i] && v2[j]) || (v1[j] && v2[i]))
				R.pb(k+1);
	}
}

int main ()
{
	read ();
	EK ();
	comp ();
	ofstream fout ("critice.out");
	fout<<R.size()<<"\n";
	for(sint i=0;i<(sint)R.size();++i)
		fout<<R[i]<<"\n";
	return 0;
}