Cod sursa(job #444885)

Utilizator ooctavTuchila Octavian ooctav Data 21 aprilie 2010 23:09:38
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.12 kb
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
const int NMAX = 1001;
const int MMAX = 10001;
const int INF = 1000000010;
using namespace std;

int N, M;
int c[NMAX][NMAX];
int f[NMAX][NMAX];
vector<int> G[NMAX];
vector<bool> viz;
pair<int, int> much[MMAX];
int tata[NMAX];
int flux = 0;
vector<bool> viz1;
vector<bool> viz2;
int rez[NMAX];

void citire()
{
	cin >> N >> M;
	int x, y, cap;
	for(int i = 1 ; i <= M ; i++)
	{
		cin >> x >> y >> cap;
		G[x].push_back(y);
		G[y].push_back(x);
		c[x][y] = cap;
		c[y][x] = cap;
		much[i] = (make_pair(x, y));
	}
}

inline bool BFS()
{
	fill(viz.begin(), viz.end(), false);
	queue<int> Q;
	Q.push(1);
	viz[1].flip();
	int x;
	vector<int> :: iterator it;
	
	while(!Q.empty())
	{
		x = Q.front();
		Q.pop();
		if(x == N)
			return viz[N];
		if(x != N)
			for(it = G[x].begin() ; it != G[x].end() ; it++)
				if(!viz[*it])
				if(c[x][*it] > f[x][*it])
				{
					tata[*it] = x;
					viz[*it] = true;
					Q.push(*it);
				}
	}
	
	return viz[N];
}

void FLUX()
{
	viz.resize(N+1);
	vector<int> :: iterator it;
	while(BFS())
		for(it = G[N].begin() ; it != G[N].end() ; it++)
			if(viz[*it] && c[N][*it] > f[N][*it])
			{
				int minim = INF;
				tata[N] = *it;
				for(int i = N ; i != 1; i = tata[i])
					minim = min(minim, c[tata[i]][i] - f[tata[i]][i]);
				if(minim <= 0 )
					break;
				flux+= minim;
				for(int i = N ; i != 1 ; i = tata[i])
				{
					f[tata[i]][i] += minim;
					f[i][tata[i]] -= minim;
				}
			}
}

void dfs1(int nod)
{
	vector<int> :: iterator it;
	viz1[nod] = 1;
	for(it = G[nod].begin() ; it != G[nod].end() ; ++it)
		if(!viz1[*it] && c[*it][nod] > f[*it][nod] && c[nod][*it] > f[nod][*it])
			dfs1(*it);
}

void dfsn(int nod)
{
	vector<int> :: iterator it;
	viz2[nod] = true;
	for(it = G[nod].begin() ; it != G[nod].end() ; ++it)
		if(!viz2[*it] && c[*it][nod] > f[*it][nod] && c[nod][*it] > f[nod][*it])
			dfsn(*it);
}

void trece()
{
	for(int i = 1 ; i <= M ; i++)
		if(viz1[much[i].first] && viz2[much[i].second] && c[much[i].first][much[i].second] == f[much[i].first][much[i].second])
			rez[++rez[0]] = i;
		/*else if(viz2[much[i].first] && viz1[much[i].second] && c[much[i].first][much[i].second] == f[much[i].first][much[i].second])
			rez[++rez[0]] = i;*/
		else if(viz2[much[i].first] && viz1[much[i].second] && c[much[i].second][much[i].first] == f[much[i].second][much[i].first])
			rez[++rez[0]] = i;
		/*else if(viz1[much[i].first] && viz2[much[i].second] && c[much[i].second][much[i].first] == f[much[i].second][much[i].first])
			rez[++rez[0]] = i;*/
}

void scrie()
{
	printf("%d\n",rez[0]);
	for(int i = 1; i <= rez[0] ; i++)
		printf("%d\n",rez[i]);
}

int main()
{
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	citire();
	FLUX();
	viz1.resize(N+1);
	dfs1(1);
	viz2.resize(N+1);
	dfsn(N);
	/*for(int i = 1 ; i <= N ; i++)
	{
		printf("%d ", i);
		if(viz1[i])
			printf("1 ");
		else
			printf("0 ");
		if(viz2[i])
			printf("1\n");
		else
			printf("0\n");
	}*/
	trece();
	scrie();
	return 0;
}