Cod sursa(job #1146773)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 19 martie 2014 11:40:57
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>

#define oo 0x3f3f3f3f

using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");

vector<int>g[220];
int c[220][220], dst[220], cap[220][220], f[220][220], t[220];
int n, s, d, sol;
bool vis[220];
queue<int>q;

inline bool BellmanFord()
{
    q.push(s);
    memset(dst,oo,sizeof(dst));
    vis[s]=1;
    dst[s]=0;
    while(!q.empty())
    {
        int x=q.front(); q.pop();
        vis[x]=0;
        for(vector<int>::iterator it=g[x].begin(); it<g[x].end(); it++ )
        {
            if(cap[x][*it]-f[x][*it]>0)
            {
                int opt=dst[x]+c[x][*it];
                if(opt<dst[*it])
                {
                    dst[*it]=opt;
                    t[*it]=x;
                    if(!vis[*it])
                    {
                        vis[*it]=1;
                        q.push(*it);
                    }
                }
            }
        }
    }
    return (dst[d]!= oo);
}

int main()
{
    fin>>n;
    for(int i = 1; i<= n; i++ )
    {
        for(int j = 1; j<= n; j++ )
        {
            fin>>c[i][n+j];
            c[n+j][i]=-c[i][n+j];
            g[i].push_back(n+j);
            g[n+j].push_back(i);
            cap[i][n+j]=1;
        }
        g[0].push_back(i);
        g[n+i].push_back(2*n+1);
        cap[n+i][2*n+1]=1;
        cap[0][i]=1;
    }
    s=0;
    d=2*n+1;
    while(BellmanFord())
    {
        for(int i = d; i !=  s; i=t[i])
            f[t[i]][i]++, f[i][t[i]]--;
        sol+=dst[d];
    }
    fout<<sol;
    fout.close();
    fin.close();
    return 0;
}