Cod sursa(job #211565)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 2 octombrie 2008 20:40:06
Problema Party Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <bitset>
using namespace std;
typedef struct rel{
        int tip,x,y;
        };
int N,M,nr;
bitset<101> inv,viz;
bitset<1001> u;
rel v[1001];
ifstream f("party.in");
ofstream g("party.out");
void redu(int i,int val){
     int j;
     viz[i]=1;inv[i]=val;
     if (val==1){
     for (j=1;j<=M;++j)
       if (!u[j])
        if (v[j].x==i || v[j].y==i)
         switch(v[j].tip){
         case 0:u[j]=1;
                break;
         case 1:u[j]=1;
                if (v[j].y==i) redu(v[j].x,1);
                break; 
         case 2:u[j]=1;
                if (v[j].x==i) redu(v[j].y,1);
                break;
         case 3:u[j]=1;
                if (v[j].x==i) redu(v[j].y,0);
                  else redu(v[j].x,0);
                break;
                }
          }else{
     for (j=1;j<=M;++j)
       if (!u[j])
        if (v[j].x==i || v[j].y==i)
         switch(v[j].tip){
         case 0:u[j]=1;
                if (v[j].x==i) redu(v[j].y,1);
                  else redu(v[j].x,1);
                break;
         case 1:u[j]=1;
                if (v[j].x==i) redu(v[j].y,0);
                break;
         case 2:u[j]=1;
                if (v[j].y==i) redu(v[j].x,0);
                break;
         case 3:u[j]=1;
              }
              }
                        
          
         }
int main(){
    int i;
    f>>N>>M;
    for (i=1;i<=M;++i){  
      f>>v[i].x>>v[i].y>>v[i].tip;
      if (v[i].x==v[i].y){
         u[i]=1;
         if (v[i].tip==0) redu(v[i].x,1);
         if (v[i].tip==3) redu(v[i].x,0);}
         }
    for (i=1;i<=N;++i)
      if (!viz[i]) 
      redu(i,1);
    for (i=1;i<=N;++i)
     if (inv[i]==1) ++nr;
    g<<nr<<'\n';;
    for (i=1;i<=N;++i)
     if (inv[i]==1) g<<i<<'\n';  
    return 0;
}