Cod sursa(job #1829054)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 14 decembrie 2016 11:45:44
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define MAXN 202
#define MAXQ (1<<17)
#define INF 1000000000
std::vector <int> G[2*MAXN+2];
int cost[MAXN+1][MAXN+1];
int flux[MAXN+1][MAXN+1];
int from[MAXN+1];
int cap[MAXN+1][MAXN+1];
int dist[MAXN+1];
bool viz[MAXN+1];
int Q[MAXQ];
int C;
inline int BF(int S,int D,int n){
    int b,e,x,nod,i;
    memset(from,0,sizeof(from));
    for(i=1;i<=n;i++)
       dist[i]=INF;
    dist[S]=0;
    Q[0]=S;
    viz[S]=1;
    b=0;
    e=1;
    while(b<e){
        nod=Q[b];
        viz[nod]=0;
        b++;
        b&=(MAXQ-1);
        for(auto x:G[nod])
        if(cap[nod][x]>flux[nod][x]&&dist[x]>dist[nod]+cost[nod][x]){
            dist[x]=dist[nod]+cost[nod][x];
            from[x]=nod;
            if(viz[x]==0){
                viz[x]=1;
                Q[e++]=x;
                e&=(MAXQ-1);
            }
        }
    }
    C=dist[D];
    if(C==INF)
          C=0;
    return C;
}
int main(){
    FILE*fi,*fout;
    int i,n,j,x,S,D,nod,min,ans;
    fi=fopen("cc.in" ,"r");
    fout=fopen("cc.out" ,"w");
    fscanf(fi,"%d " ,&n);
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++){
         fscanf(fi,"%d " ,&x);
         G[i].push_back(j+n);
         G[j+n].push_back(i);
         cost[i][j+n]=x;
         cost[j+n][i]=-x;
         cap[i][j+n]=1;
      }
    S=2*n+1;
    D=2*n+2;
    for(i=1;i<=n;i++){
      cap[S][i]=1;
      G[S].push_back(i);
      G[i].push_back(S);
    }
    for(i=1;i<=n;i++){
      cap[i+n][D]=1;
      G[i+n].push_back(D);
      G[D].push_back(i+n);
    }
    ans=0;
    while(BF(S,D,2*n+2)){
        nod=D;
        min=INF;
        while(from[nod]){
            if(min>cap[from[nod]][nod]-flux[from[nod]][nod])
                 min=cap[from[nod]][nod]-flux[from[nod]][nod];
            nod=from[nod];
        }
        nod=D;
        while(from[nod]){
            flux[from[nod]][nod]+=min;
            flux[nod][from[nod]]-=min;
            nod=from[nod];
        }
        ans+=C;
    }
    fprintf(fout,"%d" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}