Cod sursa(job #931930)

Utilizator taigi100Cazacu Robert taigi100 Data 28 martie 2013 16:41:26
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include<stdio.h>
#include<vector>
#include<string.h>

using namespace std;

#define max 710
#define inf 2000000000

int Q[max*max],dad[max],dist[max],used[max];
int C[max][max],f[max][max],edge[max][max];
int n,m,e,dest,sol,nr,imp;

vector<int> v[max],cost[max];


void getemgoin()
{
	dest=n+m+2;
	for(int i=2;i<=n+1;i++)
	{
		v[1].push_back(i); cost[1].push_back(0);
		v[i].push_back(1); cost[i].push_back(0);
		C[1][i]=1;
	}

	for(int i=n+2;i<=n+m+1;i++)
	{
		v[i].push_back(dest); cost[i].push_back(0);
		v[dest].push_back(i); cost[dest].push_back(0);
		C[i][dest]=1;
	}

}


int bellman()
{
    for (int i = 1; i <= dest; i++) {
        dist[i] = inf;
        dad[i] = -1;
        used[i] = 0;
    }
    dist[1] = 0; used[1] = 1;
 
    int st = 0, dr = 1; Q[1] = 1;
    while (st < dr) {
        st++;
 
        int len = v[Q[st]].size();
        for (int i = 0; i < len; i++) {
            if (C[Q[st]][v[Q[st]][i]] > f[Q[st]][v[Q[st]][i]] && dist[v[Q[st]][i]] > dist[Q[st]] + cost[Q[st]][i]) {
                dist[v[Q[st]][i]] = dist[Q[st]] + cost[Q[st]][i];
                dad[v[Q[st]][i]] = Q[st];
 
                if (!used[v[Q[st]][i]]) {
                    Q[++dr] = v[Q[st]][i];
                    used[v[Q[st]][i]] = 1;
                }
            }
        }
     
        used[Q[st]] = 0;
    }
 
    if (dist[dest] < inf) {
        int flux = inf;
        for (int i = dest; i != 1; i = dad[i])
            flux = min(flux, C[dad[i]][i] - f[dad[i]][i]);
 
        for (int i = dest; i != 1; i = dad[i]) {
            f[dad[i]][i] += flux;
            f[i][dad[i]] -= flux;
        }
 
        return flux * dist[dest];   
    }
    return 0;
}
void ShitStorm()
{
	getemgoin();

	imp=1;
	while(imp)
	{
		imp=bellman();
		sol+=imp;
	}
}
int main()
{
	freopen("cmcm.in","r",stdin);
	freopen("cmcm.out","w",stdout);

	scanf("%d%d%d",&n,&m,&e);
	for(int i=1;i<=e;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		b+=n+1;a++;
		v[a].push_back(b); cost[a].push_back(c);
		v[b].push_back(a); cost[b].push_back(-c);
		edge[a][b]=i;
		C[a][b]=1;
	}

	ShitStorm();

	for(int i=2;i<=n+1;i++)
		for(int j=n+2;j<dest;j++)
			if(C[i][j] && f[i][j])
			{
				nr++;
				break;
			}
	printf("%d %d\n", nr,sol);
	for(int i=2;i<=n+1;i++)
		for(int j=n+2;j<dest;j++)
			if(C[i][j] && f[i][j])
			{
				printf("%d ",edge[i][j]);
				break;
			}
		printf("\n");
}