Cod sursa(job #412632)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 5 martie 2010 20:40:46
Problema Cuplaj maxim de cost minim Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define INF 1<<30
int n,m,e,i,j,START,END,x,y,z;
int C[605][605],F[605][605],nr,c;
typedef pair <int,int> p;
int cost[605],ut[605],T[605];
struct cmp
{
	bool operator () (const int &i,const int &j) const
	{
		return cost[i]>cost[j];
	}
};
priority_queue <int,vector <int>,cmp> Q;
vector <p> g[605];
bool dijkstra()
{
	for(i=0;i<=n+m+1;i++)
		cost[i]=INF;
	cost[START]=0;
	vector <p> ::iterator it;
	for(Q.push(START);!Q.empty();)
	{
		int nod=Q.top();
		Q.pop();
		ut[nod]=0;
		for(it=g[nod].begin();it!=g[nod].end();it++)
		{
			if(C[nod][it->first]<=F[nod][it->first])
				continue;
			if(cost[it->first]<=cost[nod]+it->second)
				continue;
			cost[it->first]=cost[nod]+it->second;
			T[it->first]=nod;
			if(ut[it->first])
				continue;
			ut[it->first]=1;
			Q.push(it->first);
		}
	}
	return cost[END]==INF?0:1;
}
int main()
{
	freopen("cmcm.in","r",stdin);
	freopen("cmcm.out","w",stdout);
	scanf("%d%d%d",&n,&m,&e);
	START=0;END=m+n+1;
	for(i=1;i<=n;i++)
	{
		C[START][i]=1;
		g[START].push_back(p(i,0));
		g[i].push_back(p(START,0));
	}
	for(i=n+1;i<=n+m;i++)
	{
		C[i][END]=1;
		g[i].push_back(p(END,0));
		g[END].push_back(p(i,0));
	}
	for(i=1;i<=e;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		C[x][y+n]=1;
		g[x].push_back(p(y+n,z));
		g[y+n].push_back(p(x,-z));
	}
	while(dijkstra())
	{
		int flow=INF;
		for(i=END;i!=START;i=T[i])
			flow=min(flow,C[T[i]][i]-F[T[i]][i]);
		for(i=END;i!=START;i=T[i])
		{
			F[T[i]][i]+=flow;
			F[i][T[i]]-=flow;
		}
		++nr;
		c+=cost[END];
	}
	printf("%d %d\n",nr,c);
	freopen("cmcm.in","r",stdin);
	scanf("%d%d%d",&n,&m,&e);
	for(i=1;i<=e;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		if(F[x][y+n])
			printf("%d ",i);
	}
	return 0;
}