Pagini recente » Cod sursa (job #1518547) | Cod sursa (job #731483) | Cod sursa (job #19931) | Cod sursa (job #1829130) | Cod sursa (job #22235)
Cod sursa(job #22235)
#include<stdio.h>
#include<iomanip.h>
#include<math.h>
#define max 203
typedef struct nod{
int info;
nod*urm;
}*PNOD,NOD;
PNOD l[max];
int c[max][max],f[max][max],cost[max][max];
int d[max],t[max];
int n;
void citire();
void add(int ,int );
int bellmand();
int minimizeaza();
void drum();
void solve();
void afiseaza();
int main()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
citire();
solve();
afiseaza();
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 ]= 1;
cost[ i ][ j + n]=x;
//printf("%d ",x);
}
//printf("\n");
}
for(i=1;i<=n;i++)
{
add( 0 , i);
add( i ,0 );
c[ 0 ][ i ] = 1;
cost[ 0 ][ i ] =0;
}
for(i = n+1 ; i <= n+n ; i ++)
{
add ( i , n+n+1);
add ( n+n+1 , i);
c[ i ][ n+n+1 ]=1;
cost [ i ][ n+n+1 ]=0;
}
//PNOD p;
//for(PNOD p=l[n+n+1];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(bellmand())
drum();
}
int bellmand()
{
int i,j;
for(i=0;i<=n+n+1;i++)
{
d[i]=2000000;
t[i]=0;
}
d[0]=0;
for(i=1;i<n;i++)
if(!minimizeaza())
break;
if(d[n+n+1]== 2000000)
return 0;
return 1;
}
int minimizeaza()
{
int i,j,ok=0;
PNOD p;
for(i=0;i<=n+n+1;i++)
for(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];
t[j]=i;
ok=1;
}
if(f[j][i])
if(d[j]>d[i]-cost[j][i])
{
d[j]=d[i]-cost[j][i];
t[j]=-i;
ok=1;
}
}
return ok;
}
void drum()
{
int i,j;
i=n+n+1;
while(i)
{
j=abs(t[i]);
if(t[i]>=0) f[j][i]+=1;
else
f[i][j]-=1;
i=j;
}
}
void afiseaza()
{
int i,j,sol=0;
for(i=0;i<=n;i++)
for(j=n+1;j<=n+n;j++)
if(f[i][j])
sol+=cost[i][j];
printf("%d",sol);
}