Cod sursa(job #403955)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 25 februarie 2010 16:47:04
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<stdio.h>
#include<vector>
#include<queue>
#define INF 10000001
#define Nmx 205
#define pb push_back

using namespace std;

int n,N,cst[Nmx][Nmx];
int C[Nmx][Nmx],F[Nmx][Nmx],cost[Nmx],prec[Nmx],viz[Nmx];
vector < int > G[Nmx];

struct cmp
{
    bool operator()(int i,int j)
    {
        return cost[i]>cost[j];
    }
};
priority_queue < int, vector<int> , cmp > Q;

void citire()
{
    scanf("%d",&n);
    N=n*2+1;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        {
            scanf("%d",&cst[i][j+n]);
            cst[j+n][i]=-cst[i][j+n];
            C[i][j+n]=C[0][i]=C[j+n][N]=1;
            G[i].pb(j+n);
            G[j+n].pb(i);
            G[0].pb(i);
            G[i].pb(0);
            G[j+n].pb(N);
            G[N].pb(j+n);
        }
}

int dijkstra()
{
    for(int i=0;i<=N;++i)
    {
        cost[i]=INF;
        prec[i]=0;
        viz[i]=0;
    }
    cost[0]=0;
    viz[0]=1;
    Q.push(0);
    while(!Q.empty())
    {
        int nod=Q.top();
        Q.pop();
        viz[nod]=0;
        for(int i=0;i<G[nod].size();++i)
            if(C[nod][G[nod][i]]-F[nod][G[nod][i]]>0&&cost[G[nod][i]]>cost[nod]+cst[nod][G[nod][i]])
            {
                cost[G[nod][i]]=cost[nod]+cst[nod][G[nod][i]];
                prec[G[nod][i]]=nod;
                if(!viz[G[nod][i]])
                {
                    Q.push(G[nod][i]);
                    viz[G[nod][i]]=1;
                }
            }
    }
    if(cost[N]<INF)
        return 1;
    return 0;
}

void flux()
{
    int sol=0,cupl=0;
    while(dijkstra())
    {
        int i,Vmin=INF;
        for(i=N;i!=0;i=prec[i])
            Vmin=min(Vmin,C[prec[i]][i]-F[prec[i]][i]);
        for(i=N;i!=0;i=prec[i])
        {
            F[prec[i]][i]+=Vmin;
            F[i][prec[i]]-=Vmin;
        }
        if(Vmin)
        {
            cupl++;
            sol+=cost[N];
        }
    }
    printf("%d\n",sol);
}

int main()
{
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    citire();
    flux();
    return 0;
}