Pagini recente » Cod sursa (job #2816038) | Cod sursa (job #912547) | Cod sursa (job #1940719) | Cod sursa (job #2486093) | Cod sursa (job #2593056)
#include <bits/stdc++.h>
const int inf = 2e9;
using namespace std;
int n;
int cst[209][209];
int s,d;
int flo[209][209],cap[209][209],dist[209],dad[209],ans;
vector<int> g[209];
queue<int> q;
bool inq[209];
bool bellman()
{
for(int i=0; i<=2*n+1; ++i)
{
dist[i]=inf;
}
dist[s]=0;
q.push(s);
while(!q.empty())
{
int cn=q.front();
q.pop();
inq[cn]=false;
for(auto it : g[cn])
{
int v=dist[cn]+cst[cn][it];
if(v<dist[it] && flo[cn][it]<cap[cn][it])
{
dist[it]=v;
dad[it]=cn;
if(!inq[it])
{
q.push(it);
}
}
}
}
return dist[d]!=inf;
}
void douaparticele()
{
s=0,d=2*n+1;
for(int i=1; i<=n; ++i)
{
cap[s][i]=cap[i+n][d]=1;
g[s].push_back(i);
g[i+n].push_back(d);
}
}
void updateflux()
{
int fmin=inf;
for(int cn=d; cn!=s; cn=dad[cn])
{
fmin=min(fmin,cap[dad[cn]][cn]-flo[dad[cn]][cn]);
}
for(int cn=d; cn!=s; cn=dad[cn])
{
flo[dad[cn]][cn]+=fmin;
flo[cn][dad[cn]]-=fmin;
}
ans+=dist[d]*fmin;
}
int main()
{
ifstream fin("cc.in");
ofstream fout("cc.out");
fin>>n;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=n; ++j)
{
fin>>cst[i][j+n];
cst[j+n][i]=-cst[i][j+n];
g[i].push_back(j+n);
g[j+n].push_back(i);
cap[i][j+n]=1;
}
}
douaparticele();
while(bellman())
{
updateflux();
}
fout<<ans;
return 0;
}