Cod sursa(job #209187)

Utilizator tamicTamas Iulia tamic Data 21 septembrie 2008 11:46:40
Problema Party Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>

FILE *fin,*fout;
int i,j,m,n,k,ok,cati,x,y,tip;
int obligat[101][2];
int intrus[101][2];
int trebuie[101][101];
int nro,nri;
int luat[100];

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){
      	nro++;
         obligat[nro][0]=x;obligat[nro][1]=y;
      }
      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{
      	nri++;
         intrus[nri][0]=x;intrus[nri][1]=y;
      }
   }
   ok=0;
   for(i=1;i<=n, !ok;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] && ok){
         	cati++;
         	for(k=1;k<=nro;k++)
            	if((luat[obligat[k][0]]||luat[obligat[k][1]])==0){
               	ok=0; break;}
				for(k=1;k<=nri;k++)
            	if((luat[intrus[k][0]]&&luat[intrus[k][1]])==1){
               	ok=0; break;}
         }
      if(ok==1){
      	fprintf(fout,"%d\n",cati);
         for(j=1;j<=n;j++)
         	if(luat[j]) fprintf(fout,"%d\n",j);
      }
   }
   fclose(fin); fclose(fout);
   return 0;
}