Cod sursa(job #209211)

Utilizator tamicTamas Iulia tamic Data 21 septembrie 2008 13:22:06
Problema Party Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 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;
   if(luat[i]==-1) ok=0;
   else{
   	luat[i]=1;
   	for(j=1;j<=trebuie[i][0];j++)
   	if(luat[trebuie[i][j]]<=0) 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;incearca(a[j][k]);}
         }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;
}