Cod sursa(job #761358)

Utilizator ioanabIoana Bica ioanab Data 25 iunie 2012 18:34:17
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

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

const int N=1005;

int c[N][N],f[N][N];
int pred[N],sol[N],viz1[N],viz2[N],n,m;
bool use[N];

int a[N][N];

vector <int> v[N];

bool bfs(int S)
{
	int x;
	memset(use,false,sizeof(use));
	memset(pred,0,sizeof(pred));
	
	queue<int> q;
	
	q.push(S);
	use[S]=true;
	
	while(!q.empty())
	{
		x=q.front();
		q.pop();
		
		for(vector<int> :: iterator it=v[x].begin(); it!=v[x].end(); it++)
		{
			if(!use[*it] && c[x][*it]-f[x][*it]>0)
			{
				use[*it]=true;
				q.push(*it);
				pred[*it]=x;
				
				if((*it)==n)
					return true;
			}
		}
	}
	
	return false;
}

int calcmin(int x)
{
	int min=c[x][n]-f[x][n];
	
	while(pred[x])
	{
		if(c[pred[x]][x]-f[pred[x]][x]<min)
			min=c[pred[x]][x]-f[pred[x]][x];
		x=pred[x];
	}
	
	return min;
}

void flux()
{
	int flux,x,mm;
	
	while(bfs(1))
	{
		for(vector<int> :: iterator i=v[n].begin();i!=v[n].end();i++)
		{
			if((c[*i][n]-f[*i][n]>0) && use[*i])
			{
				mm=calcmin(*i);
				flux+=mm;
				
				f[*i][n]+=mm;
				f[n][*i]-=mm;
				
				x=*i;
				
				while(pred[x])
				{
					f[pred[x]][x]+=mm;
					f[x][pred[x]]-=mm;
					x=pred[x];
				}
			}
		}
	}
}

void dfs1(int x,int g)
{
	for(vector<int> :: iterator i=v[x].begin();i!=v[x].end();i++)
	{
		if(!viz1[*i] && c[x][*i]-f[x][*i] >0 && c[x][*i]+f[x][*i]!=0)
		{
			viz1[*i]=g;
			dfs1(*i,g);
		}
	}
}

void dfs2(int x,int g)
{
	for(vector<int> :: iterator i=v[x].begin();i!=v[x].end();i++)
	{
		if(!viz2[*i] && c[x][*i]-f[x][*i] >0 && c[x][*i]+f[x][*i]!=0)
		{
			viz2[*i]=g;
			dfs2(*i,g);
		}
	}
}


int main()
{
	int i,nr=0,x,y,cost;
	in>>n>>m;
	
	for(i=1;i<=m;i++)
	{
		in>>x>>y>>cost;
		
		a[x][y]=i;
		a[y][x]=i;
		
		c[x][y]+=cost;
		c[y][x]+=cost;
		
		v[x].push_back(y);
		v[y].push_back(x);
	}
	
	flux();
	
	viz1[1]=1;
	viz2[n]=2;
	dfs1(1,1);
	dfs2(n,2);
	
	for(i=1;i<=n;i++)
	{
		for(vector <int> :: iterator it=v[i].begin();it!=v[i].end();it++)
		{
			if(c[i][*it] && ((c[i][*it]-f[i][*it]==0) || (c[i][*it]+f[i][*it]==0)))
			{
				if(viz1[i]==1 && viz2[*it] ==2)
				{
					nr++;
					sol[nr]=a[i][*it];
				}
			}
		}
	}
	
	out<<nr<<"\n";
	for(i=1;i<=nr;i++)
		out<<sol[i]<<"\n";
	
			
	return 0;
}