Cod sursa(job #1740375)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 11 august 2016 15:29:12
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<cstdio>
#include<vector>
#include<queue>
#define MAXN 210
#define INF 2000000000
using namespace std;
int capacity[MAXN][MAXN],cost[MAXN][MAXN];
vector<int> g[MAXN];
queue<int> Queue;
int best[MAXN],dad[MAXN],inQueue[MAXN];
int n,source,sink;
void AddEdge(int a,int b){
    g[a].push_back(b);
    g[b].push_back(a);
    capacity[a][b]=1;
}
bool BellmanFord(){
    int i,node;
    for(i=0;i<=2*n+1;i++)
        best[i]=INF;
    best[source]=0;
    Queue.push(source);
    inQueue[source]=1;
    while(!Queue.empty()){
        node=Queue.front();
        Queue.pop();
        inQueue[node]=0;
        for(i=0;i<g[node].size();i++)
            if(capacity[node][g[node][i]]!=0&&best[node]+cost[node][g[node][i]]<best[g[node][i]]){
                best[g[node][i]]=best[node]+cost[node][g[node][i]];
                dad[g[node][i]]=node;
                if(inQueue[g[node][i]]==0){
                    inQueue[g[node][i]]=1;
                    Queue.push(g[node][i]);
                }
            }
    }
    if(best[sink]==INF)
        return false;
    return true;
}
int main(){
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    int i,j,answer=0,node;
    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++)
        AddEdge(source,i);
    for(i=1;i<=n;i++)
        for(j=n+1;j<=2*n;j++)
            AddEdge(i,j);
    for(i=n+1;i<=2*n;i++)
        AddEdge(i,sink);
    while(BellmanFord()==true){
        answer+=best[sink];
        for(node=sink;node!=source;node=dad[node]){
            capacity[dad[node]][node]--;
            capacity[node][dad[node]]++;
        }
    }
    printf("%d",answer);
    return 0;
}