Cod sursa(job #1166645)

Utilizator UVS_Elfus_Deneo_KiraUVS-Elfus-Dutzul-Kira UVS_Elfus_Deneo_Kira Data 3 aprilie 2014 18:48:53
Problema Cuplaj maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include<fstream>
#include<cstdio>
#include<set>
#include<stack>
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#include<cstring>
#include<bitset>
#include<cmath>
#include<iomanip>
#include<queue>
#define f cin
#define g cout
#define mp make_pair
#define pb push_back
#define ll long long
#define inf 0x3f3f3f3f
#define base 256
#define ba 255
#define N 800
#define EPS 1e-12
#define mod  98999
#define inu "cmcm.in"
#define outu "cmcm.out"
using namespace std;
ifstream f(inu);
ofstream g(outu);
//int dx[]={0,0,0,1,-1};
//int dy[]={0,1,-1,0,0};
vector<pair<int,int> > v[N];
queue<int> q;
int Cp[N][N],n,m,s,d,X[N],Y[N],edge,cuplaj,C[N],cost,minim,F[N][N],inq[N],T[N],x,y,z,c;
void init()
{
	q.push(s);
	memset(C,inf,sizeof(C));
	memset(inq,0,sizeof(inq));
	inq[s]=1;
	C[s]=0;
}
bool bellmanford()
{
	init();
	for(;!q.empty();)
	{
		int nod=q.front();
		q.pop();
		inq[nod]=0;
		for(int i=0;i<v[nod].size();++i)
		{
			int des=v[nod][i].first;
			int cost=v[nod][i].second;
			if(Cp[nod][des]>F[nod][des])
				if(C[nod]+cost<C[des])
				{
					T[des]=nod;
					C[des]=C[nod]+cost;
					if(!inq[des])
					{
						inq[des]=1;
						q.push(des);
					}
				}
		}
	}
	if(C[d]!=inf)
	{
		int des=d;
		minim=inf;
		for(;T[des];des=T[des])
			minim=min(minim,Cp[T[des]][des]-F[T[des]][des]);
		des=d;
		for(;T[des];des=T[des])
		{
			F[T[des]][des]+=minim;
			F[des][T[des]]-=minim;
		}
	}
	return C[d]!=inf;
}
void flux()
{
	while(bellmanford())
	{
		cost+=minim*C[d];
		cuplaj+=minim;
	}
	g<<cuplaj<<" "<<cost<<"\n";
	FOR(i,1,edge)
	if(F[X[i]][Y[i]])
		g<<i<<" ";
	return ;
}
int main ()
{
	f>>n>>m>>edge;
	FOR(i,1,edge)
	{
		f>>x>>y>>z;
		y+=n;
		X[i]=x;
		Y[i]=y;
		v[x].pb(mp(y,z));
		v[y].pb(mp(x,-z));
		Cp[x][y]=1;
	}
	s=n+m+2;
	d=n+m+1;
	FOR(i,1,n)
	{
		v[s].pb(mp(i,0));
		Cp[s][i]=1;
	}
	FOR(i,1,m)
	{
		v[n+i].pb(mp(d,0));
		Cp[n+i][d]=1;
	}
	flux();
    return 0;
}