Cod sursa(job #433043)

Utilizator vladbBogolin Vlad vladb Data 3 aprilie 2010 11:43:51
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<fstream>
#include<vector>
#include<queue>

#define MAXN 301
#define MAX 10000000

using namespace std;

ifstream fin("cmcm.in");
ofstream fout("cmcm.out");

int n,m,e,S,T,drum,flux,cup;
int c[2*MAXN][2*MAXN][2],f[2*MAXN][2*MAXN],pus[MAXN*2],t[MAXN*2],d[MAXN*2];

vector < pair < int,int > > v[2*MAXN];
vector < pair < int,int > > ::iterator it;
queue < int > q;

void citire()
{	int i,x,y,cst;
	fin>>n>>m>>e;
	for(i=1;i<=e;i++)
	{	fin>>x>>y>>cst;
		c[x][n+y][0]=1;
		c[x][n+y][1]=i;
		v[x].push_back(make_pair(n+y,cst));
		v[n+y].push_back(make_pair(x,-cst));
	}
	S=0;
	T=n+m+1;
	for(i=1;i<=n;i++)
	{	c[0][i][0]=1;
		v[0].push_back(make_pair(i,0));
		v[i].push_back(make_pair(0,0));
	}
	for(i=1;i<=m;i++)
	{	c[i+n][T][0]=1;
		v[i+n].push_back(make_pair(T,0));
		v[T].push_back(make_pair(i+n,0));
	}
}

int bellford()
{	int i;
	for(i=1;i<=T;i++)
	{	d[i]=MAX;
		t[i]=0;
		pus[i]=0;
	}
	pus[S]=1;
	q.push(S);
	while(!q.empty())
	{	int nod=q.front();
		for(it=v[nod].begin();it!=v[nod].end();it++)
			if(d[it->first]>d[nod]+it->second&&c[nod][it->first][0]>f[nod][it->first])
			{	d[it->first]=d[nod]+it->second;
				t[it->first]=nod;
				if(pus[it->first]==0)
				{ 	q.push(it->first);
					pus[it->first]=1;
				}
			}
		pus[nod]=0;
		q.pop();
	}
	if(d[T]!=MAX)
	{	drum=1;
		i=T;
		while(i!=S)
		{	f[t[i]][i]++;
			f[i][t[i]]--;
			i=t[i];
		}
		return d[T];
	}
	return 0;
}

void cuplaj()
{	drum=1;
	while(drum)
	{	drum=0;
		flux+=bellford();
		cup++;
	}
}

int main()
{	int i,j;
	citire();
	cuplaj();
	fout<<cup-1<<" "<<flux<<"\n";
	for(i=1;i<=n;i++)
		for(j=n+1;j<=n+m+1;j++)
			if(f[i][j]) fout<<c[i][j][1]<<" ";
	fin.close();
	fout.close();
	return 0;
}