Cod sursa(job #188240)

Utilizator gigi_becaliGigi Becali gigi_becali Data 7 mai 2008 15:06:32
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
using namespace std;
#include <cstdio>
#include <string>
#include <queue>
#define N 256
#define oo 0x3f3f3f3f
int cap[N][N], cost[N][N];
int n;
int source, sink;


inline int bellman()
{
    queue<int>Q;
    int d[N],i,t[N];
    bool inq[N];

    memset(t, 0, sizeof(t));
    memset(d, oo, sizeof(d));
    memset(inq, 0,sizeof(inq));
    inq[source]=1;
    d[source]=1;
    Q.push(source);
    int u;
    while(!Q.empty())
    {
	u=Q.front();
	Q.pop();	
	inq[u]=0;

	for(i=source;i<=sink;++i)
	    if(cap[u][i])
		if(d[u]+cost[u][i]<d[i])
		{
		    d[i]=d[u]+cost[u][i];
		    if(!inq[i]) {Q.push(i),inq[i]=1;}
		    t[i]=u;
		}
    }

   
    if(t[sink]==0) return 0;
    for(i=sink; i!=source;i=t[i])
	cap[t[i]][i]=0,
	cap[i][t[i]]=1;
    return 1;


}

void flux()
{
    while(bellman());

    int sol=0,i,j;
    for(i=1;i<=n;++i)
	for(j=n+1;j<sink;++j)
	    if(!cap[i][j]) sol+=cost[i][j];

    freopen("cc.out","w",stdout);
    printf("%d\n", sol);
}


int main()
{
    freopen("cc.in","r",stdin);
    scanf("%d\n", &n);
    source=0;
    sink=2*n+1;
    int v;
    int i, j;
    for(i=1;i<=n;++i)
	for(j=n+1;j<sink;++j)
	{
	    scanf("%d ", &v);
	    cap[i][j]=1;
	    cost[i][j]=v;
	    cost[j][i]=-v;
	}

    for(i=1;i<=n;++i) 
    {
	cap[source][i]=1;
	cost[source][i]=0;
    }

    for(i=n+1;i<sink;++i)
    {
	cap[i][sink]=1;
	cost[i][sink]=0;
    }

    flux();

    return 0;
}