Cod sursa(job #863527)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 23 ianuarie 2013 21:33:10
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
 
#define pb push_back
#define inv(a) (a<=n ? a+n : a-n)
#define NMAX 10004
 
vector<int> v[NMAX],vt[NMAX];
int t[NMAX],nrt,n,m,sol[NMAX];
int a=0,b=0,tip=-1;
char viz[NMAX];
 
void dfs(int nod)
{
    viz[nod]=1;
    int i,vec,lim=v[nod].size();
 
    for(i=0;i<lim;i++)
        if(!viz[vec=v[nod][i]])
            dfs(vec);
    t[++nrt]=nod;
}
 
void dfs2(int nod)
{
    viz[nod]=1;
    sol[inv(nod)]=1;
 
    int i,vec,lim=vt[nod].size();
     
    for(i=0;i<lim;i++)  
        if(!viz[vec=vt[nod][i]])
            dfs2(vec);
 
}
 
int main ()
{
    int i;
 
    freopen("party.in","r",stdin);
    freopen("party.out","w",stdout);
 
    scanf("%d%d",&n,&m);
     
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&tip);
//      printf("%d %d %d\n",a,b,tip);
     
        if(!tip)
        {
            v[inv(a)].pb(b);
            v[inv(b)].pb(a);
            vt[b].pb(inv(a));
            vt[a].pb(inv(b));
        }
        else if(tip==1)
        {
            v[inv(a)].pb(inv(b));
            vt[inv(b)].pb(inv(a));
            v[b].pb(a);
            vt[a].pb(b);
            //printf("muchie %d %d\nmuchie %d %d\n",inv(a),inv(b),b,a);
        }
        else if(tip==2)
        {
            v[inv(b)].pb(inv(a));
            vt[inv(a)].pb(inv(b));
            v[a].pb(b);
            vt[b].pb(a);
        }
        else
        {
            vt[inv(a)].pb(b);
            vt[inv(b)].pb(a);
            v[b].pb(inv(a));
            v[a].pb(inv(b));
//          printf("muchie %d %d\nmuchie %d %d\n",b,inv(a),a,inv(b));
        }
         
    }
     
    for(i=1;i<=2*n;i++)
        if(!viz[i])
            dfs(i);
    memset(viz,0,sizeof(viz));
 
//  printf("/////%d\n",t[2*n]);
    for(i=2*n;i>=1;i--)
        if(!viz[t[i]] && !viz[inv(t[i])])
            dfs2(t[i]);
 
    for(i=1;i<=n;i++)
        if(sol[i])
            sol[0]++;
 
    printf("%d\n",sol[0]);
 
    for(i=1;i<=n;i++)
        if(sol[i])
            printf("%d\n",i);
    return 0;
}