Cod sursa(job #1775781)

Utilizator Bodo171Bogdan Pop Bodo171 Data 10 octombrie 2016 18:32:40
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
const int nmax=210;
vector<int> v[nmax];
queue<int> q;
int cost[nmax],c[nmax][nmax],fl[nmax][nmax],prec[nmax],d[nmax][nmax];
bool inq[nmax],ok;
int i,j,n,sink,source,x,y,rasp,node;
bool bf()
{
    for(i=1;i<=sink;i++)
        cost[i]=(1<<30),inq[i]=0;
    cost[source]=0;
    q.push(source);
    while(!q.empty())
    {
        x=q.front();inq[x]=0;q.pop();
        for(i=0;i<v[x].size();i++)
        {
            y=v[x][i];
           if(fl[x][y]<c[x][y]||fl[y][x]>0)
            {
                if(cost[x]+d[x][y]<cost[y])
               {
                cost[y]=cost[x]+d[x][y];
                if(!inq[y]) {inq[y]=1;q.push(y);}
                if(fl[x][y]<c[x][y]) prec[y]=x;
                else prec[y]=-x;
              }
            }
        }
    }
    if(cost[sink]!=(1<<30)) return 1;
    return 0;
}
int main()
{
    ifstream f("cc.in");
    ofstream g("cc.out");
    f>>n;
    source=2*n+1;sink=2*n+2;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
    {
        f>>d[i][j+n];
        c[i][j+n]=1;
        d[j+n][i]=-d[i][j+n];
        v[i].push_back(j+n);
        v[j+n].push_back(i);
    }
    for(i=1;i<=n;i++)
    {
        v[source].push_back(i);
        c[source][i]=1;
        v[i].push_back(source);
        v[i+n].push_back(sink);
        c[i+n][sink]=1;
    }
    ok=1;
    while(ok!=0)
    {
        ok=bf();
        if(ok==0) continue;
        rasp+=cost[sink];node=sink;
        while(node!=source)
        {
            if(prec[node]>0) fl[prec[node]][node]++;
            else fl[node][-prec[node]]--;
            node=prec[node];
            if(node<0) node*=-1;
        }
    }
    g<<rasp;
    return 0;
}