Cod sursa(job #565877)

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