Pagini recente » Cod sursa (job #2262208) | Romanii medaliati la IOI | Istoria paginii runda/biro_daily_quest_no.2/clasament | Cod sursa (job #882835) | Cod sursa (job #1659782)
#include <bits/stdc++.h>
#define Nmax 205
#define pb push_back
#define INF 1000000000
using namespace std;
int C[Nmax][Nmax],F[Nmax][Nmax],Cost[Nmax][Nmax],sol,dp[Nmax],prv[Nmax],viz[Nmax];
int S,D,n;
vector <int> L[Nmax];
queue <int> Q;
inline bool Bellman()
{
for(int i=1;i<=D;++i) dp[i]=INF;
Q.push(S); viz[S]=1;
while(!Q.empty())
{
int nod=Q.front(); Q.pop();
viz[nod]=0;
for(auto it : L[nod])
if(F[nod][it]<C[nod][it] && dp[it]>dp[nod]+Cost[nod][it])
{
dp[it]=dp[nod]+Cost[nod][it];
prv[it]=nod;
if(!viz[it])
{
Q.push(it); viz[it]=1;
}
}
}
return (dp[D]!=INF);
}
inline void Flux()
{
int sum,minflow,i;
while(Bellman())
{
minflow=INF; sum=0;
for(i=D;i!=S;i=prv[i])
{
minflow=min(minflow,C[prv[i]][i]-F[prv[i]][i]);
sum+=Cost[prv[i]][i];
}
sol+=minflow*sum;
for(i=D;i!=S;i=prv[i])
{
F[prv[i]][i]+=minflow;
F[i][prv[i]]-=minflow;
}
}
}
int main()
{
int i,j,x;
ifstream cin("cc.in");
ofstream cout("cc.out");
cin>>n;
S=0; D=2*n+1;
for(i=1;i<=n;++i)
{
L[S].pb(i); L[i].pb(S);
C[S][i]=1;
L[i+n].pb(D); L[D].pb(i+n);
C[i+n][D]=1;
}
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
cin>>x;
L[i].pb(j+n); L[j+n].pb(i);
C[i][j+n]=1;
Cost[i][j+n]=x; Cost[j+n][i]=-x;
}
Flux();
cout<<sol<<"\n";
return 0;
}