Cod sursa(job #209191)

Utilizator tamicTamas Iulia tamic Data 21 septembrie 2008 12:10:52
Problema Party Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <stdio.h>
#include <stdlib.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],luat2[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]);
}

void vezi_daca_merge(){
    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);
         exit(0);

      }
}


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;i++){
      for(j=1;j<=n;j++) luat[j]=0;
   	incearca(i);
      for(j=1;j<=n;j++) luat2[j]=luat[j];

      for(k=1;k<=nro;k++)
        	if((luat[obligat[k][0]]||luat[obligat[k][1]])==0){
           	incearca(obligat[k][0]);
         	ok=1; cati=0;
            vezi_daca_merge();
            for(j=1;j<=n;j++) luat[j]=luat2[j];
            incearca(obligat[k][1]);
            ok=1; cati=0;
            vezi_daca_merge();
         }
      ok=1; cati=0;
      vezi_daca_merge();

   }
   return 0;
}