Cod sursa(job #228464)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 7 decembrie 2008 12:36:52
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#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 ();
}