Cod sursa(job #1157150)

Utilizator Kira96Denis Mita Kira96 Data 28 martie 2014 11:56:48
Problema Cuplaj maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#define fi first
#define se second
#include<queue>
#define INF 0x3f3f3f3f
#include<vector>
#define S 610
#define D 611
#define dif 300
#define N 650
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
queue<int> Q;
vector<pair<int,int> > v[N];
pair<int,int> des;
int Cp[N][N],T[N],F[N][N];
bool inQ[N];
int qsize,i,n,m,cuplaj,edge,X[N],Y[N],minim,cost,nod,c,z,x,y,C[N];
inline void read()
{
	freopen("cmcm.in","r",stdin);
	freopen("cmcm.out","w",stdout);
	scanf("%d%d%d",&n,&m,&edge);
	FOR(i,1,edge)
	{
		scanf("%d%d%d",&x,&y,&z);
		y+=dif;
		X[i]=x;
		Y[i]=y;
		Cp[x][y]=1;
		v[x].push_back(make_pair(y,z));
		v[y].push_back(make_pair(x,-z));
	}
	FOR(i,1,n)
	{
		v[S].push_back(make_pair(i,0));
		Cp[S][i]=1;
	}
	FOR(i,1,m)
	{
		v[i+dif].push_back(make_pair(D,0));
		Cp[i+dif][D]=1;
	}
}
inline void init()
{
	memset(inQ,0,sizeof(inQ));
	memset(C,INF,sizeof(C));
	qsize=1; Q.push(S); inQ[S]=1;
	C[S]=0; minim=INF;
}
inline bool fmcm()
{
	init(); vector<pair<int,int> >::iterator des;
	while(qsize)
	{
		nod=Q.front();
		Q.pop();
		qsize--;
		inQ[nod]=0;
		for(des=v[nod].begin();des!=v[nod].end();des++)
		{
			if(Cp[nod][des->fi]>F[nod][des->fi]&&C[des->fi]>C[nod]+des->se)
			{
				C[des->fi]=C[nod]+des->se;
				T[des->fi]=nod;
				if(!inQ[des->fi])
				{
					inQ[des->fi]=1;
					Q.push(des->fi);
					++qsize;
				}
			}
		}
	}
		if(C[D]!=INF)
		{
			for(nod=D;T[nod];nod=T[nod])
			minim=min(minim,Cp[T[nod]][nod]-F[T[nod]][nod]);
			for(nod=D;T[nod];nod=T[nod])
			{
				F[T[nod]][nod]+=minim;
				F[nod][T[nod]]-=minim;
			}
		}
	return (C[D]!=INF);
}
inline void solve()
{
	while(fmcm())
	{
		cost+=minim*C[D];
		cuplaj+=minim;
	}
	printf("%d %d\n",cuplaj,cost);
	FOR(i,1,edge)
	{
		if(F[X[i]][Y[i]])
		printf("%d ",i);
	}
}
int main ()
{
	read();
	solve();
	return 0;
}