Cod sursa(job #1766614)

Utilizator LucianTLucian Trepteanu LucianT Data 28 septembrie 2016 10:10:46
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
#define maxN 205
#define INF (1<<30)
using namespace std;
queue<int> Que;
int seen[maxN];
vector<int> v[maxN];
int n,m,i,j,x,y,z,dist[maxN],t[maxN];
int cap[maxN][maxN],cost[maxN][maxN];
int nod,mincost,source,sink;
bool bellmanford()
{
    memset(seen,false,sizeof(seen));
    for(i=0;i<=2*n+1;i++)
        dist[i]=INF;
    dist[source]=0;
    Que.push(source);
    seen[source]=true;
    while(!Que.empty())
    {
        int nod=Que.front();
        Que.pop();
        seen[nod]=0;
        for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
            if(cap[nod][*it] && dist[nod]+cost[nod][*it]<dist[*it])
            {
                dist[*it]=dist[nod]+cost[nod][*it];
                t[*it]=nod;
                if(!seen[*it])
                    seen[*it]=true,
                    Que.push(*it);
            }
    }
    return !(dist[sink]==INF);
}
int main()
{
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&cost[i][j+n]),
            cost[j+n][i]=-cost[i][j+n];
    source=0,sink=2*n+1;
    for(i=1;i<=n;i++)
        v[source].push_back(i),
        v[i].push_back(source),
        cap[source][i]=1;
    for(i=n+1;i<=2*n;i++)
        v[i].push_back(sink),
        v[sink].push_back(i),
        cap[i][sink]=1;
    for(i=1;i<=n;i++)
        for(j=n+1;j<=2*n;j++)
            v[i].push_back(j),
            v[j].push_back(i),
            cap[i][j]=1;
    while(bellmanford()==true)
    {
        mincost+=dist[sink];
        for(nod=sink;nod!=source;nod=t[nod])
            cap[t[nod]][nod]--,
            cap[nod][t[nod]]++;
    }
    printf("%d",mincost);
    return 0;
}