Cod sursa(job #565899)

Utilizator cdascaluDascalu Cristian cdascalu Data 28 martie 2011 13:46:10
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<fstream>
#include<vector>
#include<string.h>
#define MAX 1001
#define INF 0x3f3f3f3f
using namespace std;
vector<int> G[MAX];
int C[MAX][MAX], F[MAX][MAX], T[MAX],viz[MAX],N,M,V[2][10001],k;
void read()
{
	ifstream f("critice.in");
	f>>N>>M;
	int i,x,y,c;
	for(i=1;i<=M;++i)
	{
		f>>x>>y>>c;
		V[0][i] = x;
		V[1][i] = y;
		C[x][y] = C[y][x] = c;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	f.close();
}
int bf()
{
	int Q[MAX],p,u,nod;
	p = u = 1;
	Q[p] = 1;
	memset(viz,0,sizeof(viz));
	viz[1] = 1;
	while(p<=u)
	{
		nod = Q[p++];
		if(nod!=N)
		for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
			if(!viz[*it] && C[nod][*it] > F[nod][*it])
			{
				Q[++u] = *it;
				T[*it] = nod;
				viz[*it] = 1;
			}
	}
	return viz[N];
}
int minim(int a,int b)
{
	if(a<=b)return a;
	return b;
}
void bf2()
{
	int p,u,Q[MAX],nod;
	memset(T,0,sizeof(T));
	p = u = 1;
	T[1] = 1;
	T[N] = N;
	Q[p] = 1;
	while(p<=u)
	{
		nod = Q[p++];
		for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
			if(!T[*it] && C[nod][*it] > F[nod][*it])
			{
				T[*it] = T[nod];
				Q[++u] = *it;
			}
	}
	p = u = 1;
	Q[p] = N;
	while(p<=u)
	{
		nod = Q[p++];
		for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
			if(!T[*it] && C[nod][*it] > abs(F[nod][*it]))
			{
				T[*it] = T[nod];
				Q[++u] = *it;
			}
			else if(C[nod][*it] == abs(F[nod][*it]) && T[*it] == 1 && T[nod] == N)++k;
	}
}
int main()
{
	read();
	int r=INF,i;
	while(bf())
	{
		for(vector<int>::iterator it = G[N].begin();it!=G[N].end();++it)
		if(viz[*it] && C[*it][N] > F[*it][N])
		{
			T[N] = *it;
			i = N;
			r = INF;
			while(i!=1)
			{
				r = minim(r, C[T[i]][i] - F[T[i]][i]);
				i = T[i];
			}
			if(r == 0)continue;
			i = N;
			while(i!=1)
			{
				F[T[i]][i] += r;
				F[i][T[i]] -= r;
				i = T[i];
			}			
		}
	}
	bf2();
	ofstream g("critice.out");
	g<<k<<"\n";
	int x,y;
	for(i=1;i<=M;++i)
	{
		x = V[0][i];
		y = V[1][i];
		if(C[x][y] == abs(F[x][y]) && (T[x] == 1&&T[y] == N || T[x] == N&&T[y] == 1))
			g<<i<<"\n";
	}
	g.close();
	return 0;
}