Pagini recente » Cod sursa (job #326669) | Cod sursa (job #721429) | Cod sursa (job #326606) | Cod sursa (job #1877521) | Cod sursa (job #468668)
Cod sursa(job #468668)
#include <cstdio>
#include <bitset>
#include <queue>
using namespace std;
#define N 105
int n,n1;
int c[N][N];
char f[N<<1][N<<1],cap[N<<1][N<<1];
bitset< N<<1 > inq;
int d[N<<1];
int t[N<<1];
const int inf=500010;
queue< int > q;
int sursa,dest;
inline void citire()
{
scanf("%d",&n);
n1=n<<1;
sursa=n1+1;
dest=n1+2;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=n; ++j)
{
scanf("%d",&c[i][j]);
cap[i][j+n]=1;
}
}
}
inline bool bellmanFord()
{
for(int i=1; i<=dest; ++i)
d[i]=inf;
d[sursa]=0;
inq[sursa]=1;
q.push(sursa);
int nod;
while(!q.empty())
{
nod=q.front();
inq[nod]=0;
q.pop();
if(nod<=n)
{
for(int i=n+1; i<=n1; ++i)
{
if(f[nod][i]==0 && d[i]>d[nod]+c[nod][i-n])
{
d[i]=d[nod]+c[nod][i-n];
t[i]=nod;
if(inq[i]==0)
{
q.push(i);
inq[i]=1;
}
}
}
continue;
}
if(nod<=n1)
{
if(f[nod][dest]==0 && d[dest]>d[nod])
{
d[dest]=d[nod];
t[dest]=nod;
}
for(int i=1; i<=n; ++i)
{
if(f[nod][i]==-1 && d[i]>d[nod]-c[i][nod-n])
{
d[i]=d[nod]-c[i][nod-n];
t[i]=nod;
if(inq[i]==0)
{
q.push(i);
inq[i]=1;
}
}
}
continue;
}
if(nod==sursa)
{
for(int i=1; i<=n; ++i)
{
if(f[nod][i]==0 && d[i])
{
d[i]=0;
t[i]=nod;
if(inq[i]==0)
{
q.push(i);
inq[i]=1;
}
}
}
continue;
}
}
if(d[dest]==inf)
return false;
return true;
/*if(nod==dest)
{
for(int i=n+1; i<=n1; ++i)
{
if(f[nod][i]==0 && d[i]>d[nod])
{
d[i]=d[nod];
t[i]=nod;
if(inq[i]==0)
{
q.push(i);
inq[i]=1;
}
}
}
continue;
}*/
}
inline void flux()
{
for(int i=1; i<=n; ++i)
cap[sursa][i]=1;
for(int i=n+1; i<=n1; ++i)
cap[i][dest]=1;
int rez=0;
while(bellmanFord())
{
int x=dest;
while(x!=sursa)
{
++f[t[x]][x];
--f[x][t[x]];
x=t[x];
}
rez+=d[dest];
}
printf("%d\n",rez);
}
int main()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
citire();
flux();
return 0;
}