Cod sursa(job #1965415)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 14 aprilie 2017 13:15:33
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>

using namespace std;

const int INF=2140e6;
const int MaxN=7e2+5;
FILE *IN,*OUT;

int N,M,E,X,Y,F=0,C=0,flow[MaxN][MaxN],cap[MaxN][MaxN],Edges[MaxN][MaxN];
struct Edge
{
	int node,cost;
}aux;
queue<int>Queue;
int father[MaxN],cost[MaxN];
vector<Edge>G[MaxN];
bool BFS(int Start,int End)
{
	int node;
	Edge to;
	memset(father,0,sizeof father);
	for(int i=0;i<=M+N+1;i++)
		cost[i]=INF;
	cost[Start]=0;
	Queue.push(Start);
	while(!Queue.empty())
	{
		node=Queue.front();
		Queue.pop();
		for(int i=0;i<G[node].size();i++)
		{
			to=G[node][i];
			if(cap[node][to.node]-flow[node][to.node]>0&&cost[to.node]>cost[node]+to.cost)
				cost[to.node]=cost[node]+to.cost,Queue.push(to.node),father[to.node]=node;
		}
	}
	return cost[End]!=INF;
}
void Flow(int S,int D)
{
	F=C=0;
	while(BFS(S,D))
	{
		F++;
		C+=cost[D];
		for(int node=D;node!=S;node=father[node])
		{
			flow[father[node]][node]++;
			flow[node][father[node]]--;
		}
	}
}
int main()
{
	IN=fopen("cmcm.in","r");
	OUT=fopen("cmcm.out","w");

	fscanf(IN,"%d%d%d",&N,&M,&E);
	for(int i=1;i<=N;i++)
	{
		aux.cost=0,aux.node=i;
		G[0].push_back(aux);
		aux.node=0;
		G[i].push_back(aux);
		cap[0][i]=1;
	}
	for(int i=N+1;i<=N+M;i++)
	{
		aux.cost=0,aux.node=N+M+1;
		cap[i][N+M+1]=1;
		G[i].push_back(aux);
		aux.node=i;
		G[M+N+1].push_back(aux);
	}
	for(int i=1;i<=E;i++)
	{
		fscanf(IN,"%d%d%d",&X,&Y,&C);
		Y+=N;
		Edges[X][Y]=i;
		aux.cost=C,aux.node=Y;
		cap[X][Y]=1;
		G[X].push_back(aux);
		aux.cost=-C,aux.node=X;
		G[Y].push_back(aux);
	}
	Flow(0,N+M+1);
	fprintf(OUT,"%d %d\n",F,C);
	for(int i=1;i<=M+N;i++)
		for(int j=1;j<=M+N;j++)
			if(cap[i][j]&&flow[i][j])
				fprintf(OUT,"%d ",Edges[i][j]);
	return 0;
}