Pagini recente » Cod sursa (job #870538) | Cod sursa (job #536984) | Cod sursa (job #657280) | Cod sursa (job #1762861) | Cod sursa (job #302483)
Cod sursa(job #302483)
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
FILE*fin=fopen("cc.in","r");
FILE*fout=fopen("cc.out","w");
#define nm 305
#define inf 1000000000
#define pb push_back
#define min(a,b)((a)<(b)?(a):(b))
int cost[nm][nm],flow[nm][nm],cap[nm][nm],d,ans=0,inside[nm];
int dmin[nm],t[nm],n;
vector<int> g[nm];
queue<int> q;
int drum()
{
int i,nod,nnod,fl_crt;
for(i=0;i<=d;i++)
{
inside[i]=0;
dmin[i]=inf;
}
q.push(0);
inside[0]=1;
dmin[0]=0;
while(!q.empty())
{
nod=q.front();
q.pop();
inside[nod]=0;
for(i=0;i<g[nod].size();i++)
{
nnod=g[nod][i];
if(cap[nod][nnod]-flow[nod][nnod])
if(dmin[nnod]>dmin[nod]+cost[nod][nnod])
{
dmin[nnod]=dmin[nod]+cost[nod][nnod];
t[nnod]=nod;
if(!inside[nnod])
{
q.push(nnod);
inside[nnod]=1;
}
}
}
}
if(dmin[d]==inf) return 0;
fl_crt=inf;
nod=d;
while(nod)
{
fl_crt=min(fl_crt,cap[t[nod]][nod]-flow[t[nod]][nod]);
nod=t[nod];
}
ans+=fl_crt*dmin[d];
nod=d;
while(nod)
{
flow[t[nod]][nod]+=fl_crt;
flow[nod][t[nod]]-=fl_crt;
nod=t[nod];
}
return 1;
}
int main()
{
int i,j,c;
memset(cap,0,sizeof(cap));
memset(flow,0,sizeof(flow));
fscanf(fin,"%d",&n);
//multimea A->multimea B
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
fscanf(fin,"%d",&c);
g[i].pb(j+n);
g[j+n].pb(i);
cap[i][j+n]=1;
cost[i][j+n]=c;
cost[j+n][i]=-c;
}
//sursa->multimea A
for(i=1;i<=n;i++)
{
g[0].pb(i);
g[i].pb(0);
cap[0][i]=1;
cost[i][0]=cost[0][i]=0;
}
//multimea B->destinatie
d=2*n+1;
for(i=1;i<=n;i++)
{
g[d].pb(i+n);
g[i+n].pb(d);
cap[i+n][d]=1;
cost[i+n][d]=cost[d][i+n]=0;
}
while(drum());
fprintf(fout,"%d",ans);
fclose(fin);
fclose(fout);
return 0;
}