Cod sursa(job #995610)

Utilizator ludacrivasilii teodorovici ludacri Data 9 septembrie 2013 22:25:59
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<fstream>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("cc.in");
ofstream g("cc.out");
int i,n,j,s,d,flux,t[300],dist[300],c[300][300],cost[300][300];
bool viz[300];
queue<int>q;
inline bool bellmanford()
{
    int x;
    memset(viz,0,sizeof(viz));
    memset(dist,INF,sizeof(dist));
    dist[s]=0;
    viz[s]=1;
    q.push(s);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        viz[x]=0;
        for(i=1;i<=d;++i)
        if(c[x][i]&&dist[i]>dist[x]+cost[x][i])
        {
            dist[i]=dist[x]+cost[x][i];
            t[i]=x;
            if(!viz[i])
            {
                viz[i]=1;
                q.push(i);
            }
        }
    }
    return dist[d]!=INF;
}
int main()
{
    f>>n;
    s=0;
    d=2*n+1;
    for(i=1;i<=n;++i)
    {
        c[s][i]=c[n+i][d]=1;
    }
    for(i=1;i<=n;++i)
    for(j=1;j<=n;++j)
    {
        f>>cost[i][n+j];
        cost[n+j][i]=-cost[i][n+j];
        c[i][n+j]=1;
    }
    flux=0;
    while(bellmanford())
    {
        for(i=d;i!=s;i=t[i])
        --c[t[i]][i],++c[i][t[i]];
        flux+=dist[d];
    }
    g<<flux<<'\n';
    return 0;
}