Cod sursa(job #161847)

Utilizator sealTudose Vlad seal Data 18 martie 2008 21:14:46
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
using namespace std;
#include<cstdio>
#include<cstdlib>
#include<vector>
#define Nm 256
#define Not(x) ((x)>n?(x)-n:(x)+n)
char Viz[Nm];
int St[Nm],A[Nm],n,k;
vector<int> G[Nm],Gt[Nm];

void read()
{
    int m,x,y,z;

    freopen("party.in","r",stdin);
    scanf("%d%d",&n,&m);
    while(m--)
    {
        scanf("%d%d%d",&x,&y,&z);
        x+=n*((z&2)!=0); y+=n*(z&1);
        G[Not(x)].push_back(y);
        Gt[y].push_back(Not(x));
        G[Not(y)].push_back(x);
        Gt[x].push_back(Not(y));
    }
}

void DFS(int x)
{
    vector<int>::iterator it;

    Viz[x]=1;
    for(it=G[x].begin();it!=G[x].end();++it)
        if(!Viz[*it])
            DFS(*it);
    St[++k]=x;
}

void DFST(int x)
{
    vector<int>::iterator it;

    Viz[x]=1; A[k++]=x;
    for(it=Gt[x].begin();it!=Gt[x].end();++it)
        if(!Viz[*it])
            DFST(*it);
}

void solve()
{
    int i,j;

    for(i=1;i<=n<<1;++i)
        if(!Viz[i])
            DFS(i);

    memset(Viz,0,Nm*sizeof(char));
    for(i=k;i;--i)
        if(!Viz[St[i]])
        {
            k=0;
            DFST(St[i]);
            for(j=0;j<k;++j)
            {
                Viz[A[j]]=1;
                Viz[Not(A[j])]=2;
            }
        }

    for(k=0,i=1;i<=n;++i)
        if(Viz[i]==2)
            A[k++]=i;
}

void write()
{
    int i;
    
    freopen("party.out","w",stdout);
    printf("%d\n",k);
    for(i=0;i<k;++i)
        printf("%d\n",A[i]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}