Pagini recente » Cod sursa (job #334885) | Cod sursa (job #2050171) | Cod sursa (job #1465679) | Cod sursa (job #1938120) | Cod sursa (job #1708470)
#include<bits/stdc++.h>
using namespace std;
typedef struct lnod {
int nod,cost,cap,flow,last;
}nod;
const int INF=1e9+69*69;
int i,j,n,flow,rs,cost,x,id[205],tata[205],q[205],qt,qh,poz[205],d[205];
vector<nod> g[205];
add(int x,int y,int cost) {
nod r1={y,cost,1,0,(int)g[y].size()};
nod r2={x,-cost,0,0,(int)g[x].size()};
g[x].push_back(r1);
g[y].push_back(r2);
}
int Update() {
int addflow=n-flow;
for(x=2*n+1;x;x=tata[x])
{
int p=tata[x],pos=poz[x];
addflow=min(addflow,g[p][pos].cap-g[p][pos].flow);
}
for(x=2*n+1;x;x=tata[x])
{
int p=tata[x],pos=poz[x];
int rev=g[p][pos].last;
g[p][pos].flow+=addflow;
g[x][rev].flow-=addflow;
rs+=g[p][pos].cost;
}
return addflow;
}
int main()
{
ifstream cin("cc.in");
ofstream cout("cc.out");
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>n;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
cin>>cost;
add(i,n+j,cost);
}
for(i=1;i<=n;++i)
{
add(0,i,0);
add(n+i,2*n+1,0);
}
while(flow<n)
{
for(i=0;i<=2*n+2;++i) id[i]=0,d[i]=INF;
qt=qh=0; q[qt++]=0; d[0]=0;
while(qt!=qh)
{
x=q[qh++]; id[x]=2;
if(qh==2*n+2) qh=0;
for(i=0;i<(int)g[x].size();++i)
{
nod &r=g[x][i];
if(r.flow<r.cap && d[r.nod]>d[x]+r.cost)
{
d[r.nod]=d[x]+r.cost;
if(!id[r.nod])
{
q[qt++]=r.nod;
if(qt==2*n+2) qt=0;
}
else if(id[r.nod]==2)
{
if(--qh==-1) qh=2*n+1;
q[qh]=r.nod;
}
id[r.nod]=1; tata[r.nod]=x; poz[r.nod]=i;
}
}
}
if(d[2*n+1]==INF) break;
flow+=Update();
}
cout<<rs<<'\n';
return 0;
}