Pagini recente » Cod sursa (job #981788) | Cod sursa (job #2674899) | Cod sursa (job #584463) | Cod sursa (job #2207073) | Cod sursa (job #2197449)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin("cc.in");
ofstream cout("cc.out");
vector<int> v[400];
int cap[400][400];
int cost[400][400],t[400],dmin[400];
int q[130000],viz[400];
int x,y,c,z,n,m,s,d,i,j,flux,costf;
int inf = 2000000000;
int cmin = inf;
bool drum_minim(int s, int d)
{
memset(viz,0,sizeof(viz));
viz[s]=1;
int st = 1,en=1;
q[st] = s;
t[s]=-1;
dmin[s]=0;
for(int i=1; i<=2*n+1; ++i)
if(i!=s)
dmin[i]=inf;
while(st<=en)
{
int nod = q[st];
++st;
viz[nod]=0;
for(int i=0; i<v[nod].size(); ++i)
{
if(cap[nod][v[nod][i]] > 0
&& dmin[nod] + cost[nod][v[nod][i]] < dmin[v[nod][i]])
{
dmin[v[nod][i]] = dmin[nod] + cost[nod][v[nod][i]];
if(!viz[v[nod][i]])
{
++en;
q[en]=v[nod][i];
viz[v[nod][i]]=1;
}
t[v[nod][i]] = nod;
}
}
}
if(dmin[d] != inf) return 1;
return 0;
}
int main()
{
cin>>n;
for(i=1; i<=n; ++i)
for(j=1;j<=n;++j)
{
cin>>z;
x=i;
y = j;
y+=n;
v[x].push_back(y);
cap[x][y]=1;
cost[x][y]=z;
v[y].push_back(x);
cap[y][x]=0;
cost[y][x]=-z;
}
for(i=1;i<=n;++i)
{
v[0].push_back(i);
v[i].push_back(0);
cap[0][i]=1;
cap[i][0]=0;
}
for(i=n+1;i<=2*n;++i)
{
v[2*n+1].push_back(i);
v[i].push_back(2*n+1);
cap[i][2*n+1]=1;
}
int nod = d;
s = 0;
d=2*n+1;
while(drum_minim(s,d))
{
nod = d;
cmin = inf;
while(nod != s)
{
cmin = min(cmin,cap[t[nod]][nod]);
nod = t[nod];
}
flux += cmin;
costf += dmin[d]*cmin;
nod = d;
while(nod !=s)
{
cap[nod][t[nod]] += cmin;
cap[t[nod]][nod] -= cmin;
nod = t[nod];
}
}
cout<<costf;
return 0;
}