Cod sursa(job #1078409)

Utilizator hevelebalazshevele balazs hevelebalazs Data 12 ianuarie 2014 10:47:08
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <vector>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define N 100
using namespace std;
vector<int>oo[2*N+1],OO[2*N+1];
vector<int>*o=oo+N,*O=OO+N;
bool C[2*N+1],V[2*N+1];
bool*c=C+N,*v=V+N;
int L[2*N],l,S;
void dfs1(int i){
    c[i]=true;
    int s=o[i].size();
    fr(j,0,s) if(!c[o[i][j]]) dfs1(o[i][j]);
    L[--l]=i;
    }
void dfs2(int i){
    c[i]=false;
    v[-i]=true;
    if(i<0) ++S;
    int s=O[i].size();
    fr(j,0,s) if(c[O[i][j]]) dfs2(O[i][j]);
    }
int main(){
    freopen("party.in","r",stdin);
    freopen("party.out","w",stdout);
    int n,m,x,y,z;
    scanf("%i%i",&n,&m);
    fr(i,0,m){
        scanf("%i%i%i",&x,&y,&z);
        if(z&1) y=-y;
        if(z&2) x=-x;
        o[-x].push_back(y);
        o[-y].push_back(x);
        O[y].push_back(-x);
        O[x].push_back(-y);
        }
    l=n<<1;
    fr(i,-n,n+1){
        if(!i)continue;
        if(!c[i])dfs1(i);
        }
    fr(i,0,n<<1){
        if(v[-L[i]]||v[L[i]])continue;
        if(c[L[i]])dfs2(L[i]);
        }
    printf("%i\n",S);
    fr(i,1,n+1) if(v[i])printf("%i ",i);
    return 0;
    }