Pagini recente » Cod sursa (job #881597) | Cod sursa (job #2137023) | Cod sursa (job #30930) | Cod sursa (job #2831522) | Cod sursa (job #59691)
Cod sursa(job #59691)
#include <stdio.h>
#define NMAX 100
FILE *fin,*fout;
int N;
int cap[2*NMAX+2][2*NMAX+2];
int dist[2*NMAX+2][2*NMAX+2];
int sursa,dest;
int d[2*NMAX+2],tata[2*NMAX+2];
const int pin=100000000;
void recurs(int nod)
{if (nod)
{cap[tata[nod]][nod]--;
cap[nod][tata[nod]]++;
recurs(tata[nod]);
}
}
int flux()
{int i,j,bol;
for (i=sursa;i<=dest;++i) {d[i]=pin;tata[i]=0;}
d[sursa]=0;
bol=1;
while (bol)
{bol=0;
for (i=sursa;i<=dest;++i)
if (d[i]!=pin)
for (j=sursa;j<=dest;++j)
if (cap[i][j]&&d[j]>d[i]+dist[i][j]) {d[j]=d[i]+dist[i][j];bol=1;tata[j]=i;}
}
if (tata[dest])
recurs(dest);
return (tata[dest]!=0);
}
int main()
{int i,j,S=0;
fin=fopen("cc.in","r");
fscanf(fin,"%d",&N);
for (i=1;i<=N;++i)
for (j=1;j<=N;++j)
{fscanf(fin,"%d",&dist[i][N+j]);
dist[N+j][i]=-dist[i][N+j];
cap[i][N+j]=1;
}
fclose(fin);
sursa=0;
dest=2*N+1;
for (i=1;i<=N;++i)
{cap[sursa][i]=1;
cap[N+i][dest]=1;
}
while (flux());
for (i=1;i<=N;++i)
for (j=N+1;j<=2*N;++j)
if (!cap[i][j]) S+=dist[i][j];
fout=fopen("cc.out","w");
fprintf(fout,"%d\n",S);
fclose(fout);
return 0;
}