Cod sursa(job #523590)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 18 ianuarie 2011 16:57:58
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
// infoarena: problema/critice //
#include <fstream>
#include <vector>
#include <queue>
#include <cmath>
#define pp(A,B) push_back(make_pair(A, B))
using namespace std;

const int MAXN = 1010;
const int MAXM = 5010;

ifstream in("critice.in");
ofstream out("critice.out");

vector<int> g[MAXN], vn;
vector<pair<int,int> > M;
deque<int> q;
vector<int> sol;
vector<int>::iterator it;
int n,m,e[MAXM],i,j,c[MAXN][MAXN],f[MAXN][MAXN],t[MAXN],nod,x,y,z,flux,r,k;
bool can[MAXN][MAXN],ok;

int prepare(int nod)
{
	for(typeof(g[nod].begin()) it=g[nod].begin(); it!=g[nod].end(); ++it)
		if(abs(c[nod][*it]) != abs(f[nod][*it]) && !can[nod][*it])
		{
			can[nod][*it] = can[*it][nod] = true;
			prepare(*it);
		}
}

int critic(int muchie)
{
	int x,y;
	x = M[muchie].first;
	y = M[muchie].second;
	if(abs(c[x][y]) != abs(f[x][y]))
		return false;
	
	
}

int bfs()
{
	int ret = false;
	for(i=1; i<=n; i++)
		t[i] = 0;
	
	q.clear();
	q.push_front(1);
	while(!q.empty())
	{
		nod = q.front();
		q.pop_front();
		
		for(it=g[nod].begin(); it!=g[nod].end(); it++)
			if(f[nod][*it] < c[nod][*it] && !t[*it])
			{
				if(*it == n)
					ret = true;
				t[*it] = nod;
				q.push_back(*it);
			}
	}
	return ret;
}

int main()
{
	in>>n>>m;
	for(i=1; i<=m; i++)
	{
		in>>x>>y>>z;
		g[x].push_back(y);
		g[y].push_back(x);
		if(y == n)
			vn.push_back(x);
		c[x][y] = z;
		c[y][x] = z;
		M.pp(x,y);
	}
	
	while(bfs())
	{
		r = 1<<29;
		for(it=vn.begin(); it!=vn.end(); it++)
		{
			if(t[*it] <= 0)
				continue;
			i = *it;
			r = c[i][n] - f[i][n];
			if(r<=0)
				continue;
			while(i!=1)
			{
				r = min(r, c[t[i]][i] - f[t[i]][i]);
				i = t[i];
			}
			
			i = *it;
			f[*it][n] += r;
			f[n][*it] -= r;
			while(i!=1)
			{
				f[t[i]][i] += r;
				f[i][t[i]] -= r;
				k = t[i];
				i = k;
			}
			flux += r;
		}
	}	
	
	prepare(n); 
	
	for(i=0; i<m; i++)
	{
		x = M[i].first;
		y = M[i].second;
		if(f[x][y] < 0)
			swap(x,y);
		ok = false;
		for(typeof(g[x].begin()) it=g[x].begin(); it!=g[x].end(); it++)
			if(can[x][*it])
			{
				ok=true;
				break;
			}
		if(abs(c[x][y]) == abs(f[x][y]) && !ok)
			sol.push_back(i+1);
		//out<<i+1<<": "<<x<<' '<<y<<" --> C: "<<c[x][y]<<" , F: "<<f[x][y]<<((c[x][y]==f[x][y]||c[x][y]==-f[x][y])&&!ok?" CRITIC":"")<<endl; 
	}
	out<<sol.size()<<'\n';
	for(typeof(sol.begin()) it=sol.begin(); it!=sol.end(); it++)
		out<<*it<<'\n';
	
	return 0;
}