Pagini recente » Cod sursa (job #2584869) | Cod sursa (job #1054269) | Cod sursa (job #1096549) | Cod sursa (job #2494077) | Cod sursa (job #6241)
Cod sursa(job #6241)
#include<stdio.h>
#include<math>
#define dim 101
using namespace std;
typedef struct nod{
int info;
nod*urm;
}*PNOD,NOD;
PNOD l[2*dim+1];
int f[dim][dim],t[dim],s[dim],c[dim][dim],cost[dim][dim],d[dim];
int n;
int flow=0;
void citire();
void add(int ,int );
void solve();
void drum();
int minimizeaza();
void afisare();
int bellmanford();
int main()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
citire();
solve();
afisare();
return 0;
}
void citire()
{
int i,j,x;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&x);
add( i,j+n);
add(j+n,i);
c[i][j+n]=c[j+n][i]=1;
cost[i][j+n]=cost[j+n][i]=x;
}
//printf("\n");
}
for(i=1;i<=n;i++)
{
add ( 0,i);
add (i,0);
c[0][i]=c[i][0]=1;
cost[0][i]=cost[i][0]=0;
}
for(j=n+1;j<=n+n;j++)
{
add(j,n+n+1);
add(n+n+1,j);
c[j][n+n+1]=c[n+n+1][j]=1;
}
//for(PNOD p=l[0];p;p=p->urm)
//printf("%d ",p->info);
}
void add(int i,int j)
{
PNOD p=new NOD;
p->info=j;
p->urm=l[i];
l[i]=p;
}
void solve()
{
while(bellmanford())
drum();
}
int bellmanford()
{
int i;
for(i=0;i<=n+n+1;i++)
{
d[i]=2000;
t[i]=0;
}
d[0]=0;
for(i=0;i<=n+n+1;i++)
minimizeaza();
if(d[n+n+1]==2000)
return 0;
return 1;
}
int minimizeaza()
{
int i,j,ok;
ok=0;
for(i=0;i<=n+n+1;i++)
for(PNOD p=l[i];p;p=p->urm)
{
j=p->info;
if(c[i][j]>f[i][j])
if(d[j]>d[i]+cost[i][j])
{
d[j]=d[i]+cost[i][j];
ok=1;
t[j]=i;
if(j==n+n+1) return 1;
}
if(f[j][i])
if(d[j]>d[i]-cost[i][j])
{
d[j]=d[i]-cost[i][j];
ok=1;
t[j]=-i;
if(j==n+n+1) return 1;
}
}
return ok;
}
void drum()
{
int i,j;
j=n+n+1;
while(j)
{
i=abs(t[j]);
if(t[i]>=0) f[i][j]++;
else
f[j][i]--;
j=i;
}
flow++;
}
void afisare()
{
printf("%d \n",flow);
int i,j,sol=0;
for(i=1;i<=n;i++)
{
for(j=n+1;j<=n+n;j++)
if(f[i][j])
sol+=cost[i][j];
//printf("%d %d",i,j-n);
//printf("\n");
}
printf("%d",sol);
}