Cod sursa(job #25466)

Utilizator C_OvidiuCotletz Ovidiu C_Ovidiu Data 4 martie 2007 12:40:27
Problema Balanta Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasa a 10-a Marime 2.39 kb
#include<stdio.h>
#include<fstream.h>
#define nmax 1029
int a[nmax],sol,b[nmax],n,m,k[nmax],ts[nmax][nmax],td[nmax][nmax],r[nmax];

void citeste()
{int i,j;
 freopen("balanta.in","r",stdin);
  scanf("%d%d",&n,&m);
 for(i=1;i<=m;i++)
  {scanf("%d",&k[i]);
   for(j=1;j<=k[i];j++)
	 scanf("%d",&ts[i][j]);
   for(j=1;j<=k[i];j++)
	 scanf("%d",&td[i][j]);
   scanf("%d",&r[i]);
   }
}

void afiseaza()
 {
 freopen("balanta.out","w",stdout);
 printf("%d",sol);
 fclose(stdout);

 }

int scadere()
{int i,so;
for(i=1;i<=n;i++)
   if(a[i]&&b[i])
	 a[i]=0;
 for(i=1;i<=n;i++)
   if(a[i])
	 if(!so)
	   so=i;
	 else
	   return 0;
 return so;
 }

void init1()
{int i,j;
 for(i=1;i<=m;i++)
  if(r[i]==1)
	 {
	 for(j=1;j<=k[i];j++)
	   a[ts[i][j]]=1;
	 return;
	 }
  else
	if(r[i]==2)
	 {for(j=1;j<=k[i];j++)
	   a[td[i][j]]=1;
	 return;
	 }
}

void init2()
{int i,j;
 for(i=1;i<=m;i++)
  if(r[i]==1)
	 {for(j=1;j<=k[i];j++)
	   a[td[i][j]]=1;
	  return;
	  }
  else if(r[i]==2)
	 {for(j=1;j<=k[i];j++)
	   a[ts[i][j]]=1;
	  return;
	  }

}





int rezolva()
{int i,j,a1[nmax],sol1=0,sol2=0;
 //moneda e mai grea
 init1();
 for(i=1;i<=m;i++)
  {memset(a1,0,sizeof(a1));
   if(r[i]==0)
	{for(j=1;j<=k[i];j++)
	   b[ts[i][j]]=b[td[i][j]]=1;
	 }
   else
	if(r[i]==1)
	   {for(j=1;j<=k[i];j++)
		  if(a[ts[i][j]])
			a1[ts[i][j]]=1;
		for(j=1;j<=k[i];j++)
			b[td[i][j]]=1;


		memcpy(a,a1,sizeof(a1));
		}
	 else
	   {for(j=1;j<=k[i];j++)
		  if(a[td[i][j]])
			 a1[td[i][j]]=1;
		for(j=1;j<=k[i];j++)
		  b[ts[i][j]]=1;


		memcpy(a,a1,sizeof(a1));
		}

	}

sol1=scadere();
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));

init2();

//if(sol)
//   return sol;
for(i=1;i<=m;i++)
  {memset(a1,0,sizeof(a1));
   if(r[i]==0)
	{for(j=1;j<=k[i];j++)
	   b[ts[i][j]]=b[td[i][j]]=1;
	 }
   else
	if(r[i]==1)
	   {for(j=1;j<=k[i];j++)
		  if(a[td[i][j]])
			a1[td[i][j]]=1;
		for(j=1;j<=k[i];j++)
		  b[ts[i][j]]=1;


		memcpy(a,a1,sizeof(a1));
		}
	 else
	   {for(j=1;j<=k[i];j++)
		  if(a[ts[i][j]])
			 a1[ts[i][j]]=1;
		for(j=1;j<=k[i];j++)
		  b[td[i][j]]=1;

		memcpy(a,a1,sizeof(a1));
		}

	}
sol2=scadere();
if(sol1&&(!sol2))

 return sol1;
if(sol2&&(!sol1))
  return sol2;

return 0;
}



int main()
{citeste();
 sol=rezolva();
 afiseaza();
 return 0;
 }