Cod sursa(job #23269)

Utilizator varuvasiTofan Vasile varuvasi Data 28 februarie 2007 15:58:23
Problema Cc Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#define MaxN 30
#define INF 1000001

int N, M;
int C[MaxN][MaxN], F[MaxN][MaxN], cost[MaxN][MaxN];
int t[MaxN], d[MaxN], e[30001][3];
int dist;

int augment()
{
    int i, j, pas, ok = 1, k, c;

    for (i = 0; i <= 2*N+1; i++) t[i] = -1, d[i] = INF;
    d[0] = 0;

    for (pas = 1; pas < 2*N+1 && ok; pas++)
	for (ok = 0, k = 1; k <= M; k++)
	    {
		i = e[k][0];
		j = e[k][1];
		c = e[k][2];
		if (C[i][j] > F[i][j] && d[j] > d[i] + c)
		{
		    d[j] = d[i] + c;
		    t[j] = i;
		    ok = 1;
		}
		if (C[j][i] > F[j][i] && d[i] > d[j] - c)
		{
		    d[i] = d[j] - c;
		    t[i] = j;
		    ok = 1;
		}
	    }

    if (d[2*N+1] != INF) return 1;
    return 0;
}
void update()
{
    int i, j;

    for (i = 2*N+1; i != 0; i = t[i])
	F[t[i]][i] += 1, F[i][t[i]] -= 1;

    dist += d[2*N+1];
}

void flux_mcm()
{
    while (augment())
	update();
}

int main()
{
    int i, j;

    FILE *fin = fopen("cc.in", "rt");
    FILE *fout = fopen("cc.out", "wt");
    fscanf(fin, "%d", &N);

    for (i = 1; i <= N; i++)
	for (j = 1; j <= N; j++)
	{
	fscanf(fin, "%d", &cost[i][N+j]);
	e[++M][0] = i, e[M][1] = j+N, e[M][2] = cost[i][N+j];
	}

    for (i = 1; i <= N; i++)
	for (j = N+1; j <= 2*N; j++) C[i][j] = 1;

    for (i = 1; i <= N; i++)
    {
	e[++M][0] = 0, e[M][1] = i, e[M][2] = 0;
	e[++M][0] = N + i, e[M][1] = 2*N+1, e[M][2] = 0;
	C[0][i] = C[N+i][2*N+1] = 1;
    }
    
    flux_mcm();
    
    fprintf(fout, "%d", dist);
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}