Cod sursa(job #728709)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 28 martie 2012 21:52:33
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb

#include <cstdio>
#include <fstream>
#include <vector>
#include <queue>
#include <cmath>

using namespace std;

#define f first
#define s second
#define pb push_back

typedef vector<int>::iterator IT;

const int N=1024;
pair<int,int>M[10001];
vector<int> v[N],sol;
int c[N][N],f[N][N],n,m,t[N];

void read ()
{
	ifstream in ("critice.in");
	in>>n>>m;
	for(int x,y,cst,i=1;i<=m;++i)
	{
		in>>x>>y>>cst;
		v[x].pb(y);
		v[y].pb(x);
		c[x][y]=c[y][x]=cst;
		M[i].f=y;
		M[i].s=x;
	}
}

bool BF ()
{
	vector<bool> uz(n+1);
	queue<int> q;
	for(q.push(1);q.size();q.pop())
	{
		int nd=q.front();
		for(IT it=v[nd].begin();it<v[nd].end();++it)
			if(!uz[*it]&&c[nd][*it]-f[nd][*it]>0)
			{
				uz[*it]=1;
				t[*it]=nd;
				q.push(*it);
			}
	}
	return uz[n];
}

vector<int> BFS (int nd)
{
	vector<int> uz(n+1);
	queue<int> q;
	for(q.push(nd);q.size();q.pop())
	{
		nd=q.front();
		for(IT it=v[nd].begin();it<v[nd].end();++it)
			if(!uz[*it]&&c[nd][*it]-(int)abs((double)f[nd][*it])>0&&*it!=n&&*it!=1)
			{
				uz[*it]=1;
				q.push(*it);
			}
	}
	return uz;
}

void solve ()
{
	for(;BF();)
	{
		for(IT it=v[n].begin();it<v[n].end();++it)
		{
			int mm=c[*it][n]-f[*it][n];
			for(int i=*it;i!=1;i=t[i])
				if(mm>c[t[i]][i]-f[t[i]][i])
					mm=c[t[i]][i]-f[t[i]][i];
			f[*it][n]+=mm;
			f[n][*it]-=mm;
			for(int i=*it;i!=1;i=t[i])
			{
				f[t[i]][i]+=mm;
				f[i][t[i]]-=mm;
			}
		}
	}
	vector<int> uz1=BFS(1);
	vector<int> uz2=BFS(n);
	uz1[1]=1;
	uz2[n]=1;
	for(int i=1;i<=m;++i)
	{
		int x=M[i].f,y=M[i].s;
		if((f[x][y]==c[x][y]||f[y][x]==c[y][x])&&((uz1[x]&uz2[y])||(uz1[y]&uz2[x])))
			sol.pb(i);
	}
}

void out ()
{
	freopen ("critice.out","w",stdout);
	printf("%d\n",sol.size());
	for(IT it=sol.begin();it<sol.end();++it)
		printf("%d\n",*it);
}

int main ()
{
	read ();
	solve ();
	out ();
	return 0;
}