Cod sursa(job #761336)

Utilizator ioanabIoana Bica ioanab Data 25 iunie 2012 17:10:34
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 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],viz[N],n,m;
bool use[N];

struct point 
{
	int x,y;
};

point a[10005];
vector <int> v[N];

bool bfs(int S, int D)
{
	int x;
	memset(use,false,sizeof(use));
	memset(pred,0,sizeof(pred));
	
	if(S==D)
		return true;
	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)==D)
					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,n))
	{
		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 dfs(int x,int g)
{
	for(vector<int> :: iterator i=v[x].begin();i!=v[x].end();i++)
	{
		if(!viz[*i] && c[x][*i]-f[x][*i] >0 && c[x][*i]+f[x][*i]!=0)
		{
			viz[*i]=g;
			dfs(*i,g);
		}
	}
}

int main()
{
	int i,nr=0,x,y,cost;
	in>>n>>m;
	
	for(i=1;i<=m;i++)
	{
		in>>a[i].x>>a[i].y>>cost;
		
		c[a[i].x][a[i].y]+=cost;
		c[a[i].y][a[i].x]+=cost;
		
		v[a[i].x].push_back(a[i].y);
		v[a[i].y].push_back(a[i].x);
	}
	
	flux();
	
	viz[1]=1;
	viz[n]=n;
	dfs(1,1);
	dfs(n,n);
	
	for(i=1;i<=m;i++)
	{
		x=a[i].x;
		y=a[i].y;
		if((c[x][y]-f[x][y]==0) || (c[x][y]+f[x][y]==0))
		{
			if((viz[x]==1 && viz[y]==n) || (viz[x]==n && viz[y]==1))
			{
				nr++;
				sol[nr]=i;
			}
		}
	}
	
	out<<nr<<"\n";
	for(i=1;i<=nr;i++)
		out<<sol[i]<<"\n";
	
			
	return 0;
}