Pagini recente » Cod sursa (job #3188136) | Cod sursa (job #2618727) | Cod sursa (job #1883229) | Cod sursa (job #2464244) | Cod sursa (job #3143397)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
const int INF = 1e9;
int n;
vector<int> con[205];
int capacity[205][205];
int cost[205][205];
int prec[205];
int dist[205];
void ford()
{
for(int i=1;i<=2*n+2;i++)
{
prec[i]=0;
dist[i]=INF;
}
dist[2*n+1]=0;
prec[2*n+1]=-1;
deque<int> dq;
dq.push_back(2*n+1);
while(!dq.empty())
{
int nod = dq.front();
dq.pop_front();
for(auto adj:con[nod])
{
if(capacity[nod][adj]>0 && dist[adj]>dist[nod]+cost[nod][adj])
{
prec[adj]=nod;
dist[adj]=dist[nod]+cost[nod][adj];
dq.push_back(adj);
}
}
}
}
int maxflow_mincost()
{
int flow=0,mincost=0;
while(1)
{
ford();
if(dist[2*n+2]==INF)
break;
int cur=2*n+2,mnm=INF;
while(cur!=2*n+1)
{
mnm=min(mnm,capacity[prec[cur]][cur]);
cur=prec[cur];
}
cur=2*n+2;
while(cur!=2*n+1)
{
capacity[prec[cur]][cur]-=mnm;
capacity[cur][prec[cur]]+=mnm;
mincost+=cost[prec[cur]][cur];
cur=prec[cur];
}
flow+=mnm;
}
return mincost;
}
signed main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
con[2*n+1].push_back(i);
//con[i].push_back(2*n+1);
capacity[2*n+1][i]=1;
con[i+n].push_back(2*n+2);
//con[2*n+2].push_back(i+n);
capacity[i+n][2*n+2]=1;
for(int j=1;j<=n;j++)
{
fin>>cost[i][j+n];
cost[j+n][i]=-cost[i][j+n];
con[i].push_back(j+n);
con[j+n].push_back(i);
capacity[i][j+n]=1;
}
}
fout<<maxflow_mincost();
return 0;
}