Pagini recente » Cod sursa (job #2271081) | Cod sursa (job #2973086) | Cod sursa (job #156481) | Cod sursa (job #2751193) | Cod sursa (job #80922)
Cod sursa(job #80922)
# include <stdio.h>
# include <stdlib.h>
const long int MAXN=205;
typedef struct NOD{long int inf; NOD *next;};
NOD *prim=NULL,*ultim=NULL;
long int n,sol,cost[MAXN+1][MAXN+1],tata[MAXN+1];
short cap[MAXN+1][MAXN+1];
const long int INF=0xfffffff;
void citire()
{
FILE *f=fopen("cc.in","r");
fscanf(f,"%ld",&n);
long int i,j,cc;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
fscanf(f,"%ld",&cc);
cost[i][j+n]=cc;
cost[j+n][i]=-cc;
cap[i][j+n]=1;
}
fclose(f);
for (i=1;i<=n;i++)
{
cap[0][i]=1;
cap[i+n][2*n+1]=1;
}
}
void scrie()
{
FILE *g=fopen("cc.out","w");
fprintf(g,"%ld\n",sol);
fcloseall();
}
void add(long int inf)
{
NOD *p=(NOD*) malloc (sizeof(NOD));
(*p).next=NULL;(*p).inf=inf;
if (prim)
{
(*ultim).next=p;
ultim=p;
}
else
{
prim=ultim=p;
}
}
void gaseste_drum_minim()
{
long int i;
NOD *p;
long int r[MAXN+1];
for (i=1;i<=2*n+1;i++) r[i]=INF;
r[0]=0;
tata[2*n+1]=0;
add(0);
while (prim)
{
for (i=0;i<=2*n+1;i++)
if (i!=(*prim).inf&&cap[(*prim).inf][i]&&r[i]>r[(*prim).inf]+cost[(*prim).inf][i])
{
tata[i]=(*prim).inf;
r[i]=r[(*prim).inf]+cost[(*prim).inf][i];
add(i);
}
p=prim;
prim=(*prim).next;
free(p);
}
}
void satureaza()
{
long int i=2*n+1,p;
p=tata[i];
while (i)
{
sol+=cost[p][i];
cap[p][i]--;
cap[i][p]++;
i=p;
p=tata[i];
}
}
void flux()
{
do
{
gaseste_drum_minim();
if (tata[2*n+1]==0) break;
satureaza();
}
while (1);
}
int main()
{
citire();
flux();
scrie();
return 0;
}