Cod sursa(job #209205)

Utilizator tamicTamas Iulia tamic Data 21 septembrie 2008 13:02:26
Problema Party Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>   
  
FILE *fin,*fout;   
int i,j,m,n,k,ok,cati,x,y,tip;   
int trebuie[1001][1001],a[1001][1001],b[1001][1001];
int nro,nri;
int luat[1001];

void incearca(int i){
   int j;
   luat[i]=1;
   for(j=1;j<=trebuie[i][0];j++)
   if(!luat[trebuie[i][j]]) incearca(trebuie[i][j]);
}

int main(){
    fin=fopen("party.in","r");
   fout=fopen("party.out","w");
   fscanf(fin,"%d%d",&n,&m);
   for(i=1;i<=m;i++){
    fscanf(fin,"%d%d%d",&x,&y,&tip);
      if(tip==0){
        a[x][0]++; a[x][a[x][0]]=y;
        a[y][0]++; a[y][a[y][0]]=x;
      }
      else
      if(tip==1){
        trebuie[y][0]++;
         trebuie[y][trebuie[y][0]]=x;
      }
      else
      if(tip==2){
        trebuie[x][0]++;
         trebuie[x][trebuie[x][0]]=y;
      }
      else{
        b[x][0]++; b[x][b[x][0]]=y;
        b[y][0]++; b[y][b[y][0]]=x;
      }
   }
   ok=0;
   for(i=1;i<=n, !ok;i++)
   if(!luat[i]){
      for(j=1;j<=n;j++) luat[j]=0;
      ok=1; cati=0;

    	incearca(i);
      for(j=1;j<=n;j++)
      	if(luat[j]<=0)
         	for(k=1;k<=a[j][0];k++)
            	if(luat[a[j][k]]==-1) ok=0;
               else luat[a[j][k]]=1;
         else
         	for(k=1;k<=b[j][0];k++)
            	if(luat[b[j][k]]==1) ok=0;
               else luat[b[j][k]]=-1;

      for(j=1;j<=n;j++) if(luat[j]==1) cati++;
		if(ok==1){
        fprintf(fout,"%d\n",cati);
         for(j=1;j<=n;j++)
            if(luat[j]==1) fprintf(fout,"%d\n",j);
      }
   }
   fclose(fin); fclose(fout);
   return 0;
}