Pagini recente » Cod sursa (job #190930) | Istoria paginii utilizator/oana019 | Istoria paginii utilizator/bielycmok | Rating Miu Mihai (MiuMihai) | Cod sursa (job #228464)
Cod sursa(job #228464)
#include <stdio.h>
#include <string.h>
#define C 101
int n,d[C][C],l[C],r[C],p[C],cr[C],cc[C],vr[C],vc[C],sol;
void readd(),find_zero(),ungar();
int main()
{
readd();
ungar();
return 0;
}
void readd()
{ int i,j;
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf ("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf ("%d",&d[i][j]);
}
void ungar()
{ int k,i;
for (k=1;k<=n;k++)
{ for(i=1;i<=n;i++)cr[i]=0;
for(i=1;i<=n;i++)p[i]=0;
for(i=1;i<=n;i++)cc[i]=l[i];
find_zero ();
}
for(i=1;i<=n;i++)sol+=d[i][r[i]];
}
void find_zero ()
{
int i, j, min=1000000, t;
for (i=1;i<=n;i++)
if (!cr[i])
for(j=1;j<=n;j++)
if (!cc[j])
if(min>d[i][j]+vr[i]-vc[j])
min=d[i][j]+vr[i]-vc[j];
for (i=1;i<=n;i++)if(cr[i])vr[i]+=min;
for (j=1;j<=n;j++)if(!cc[j])vc[j]+=min;
for (i=1;i<=n;i++)
if(!cr[i])
for (j=1;j<=n;j++)
if (!cc[j]&&d[i][j]+vr[i]==vc[j])
if (r[i])
{ p[i]=j;cr[i]=1;cc[r[i]]=0;break;}
else
{ for(t=1;t;){t=l[j];r[i]=j;l[j]=i;i=t;j=p[i];}
return;
}
find_zero ();
}