Cod sursa(job #1684047)

Utilizator touristGennady Korotkevich tourist Data 10 aprilie 2016 19:02:42
Problema Party Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>
#define Nmax 205
#define pb push_back

using namespace std;

vector <int> L[Nmax],T[Nmax],sol;
int ans[Nmax],viz[Nmax],v[Nmax],l,marked[Nmax],n;

inline int non(int x)
{
    if(x<=n) return x+n;
    return x-n;
}

inline void Dfs(int nod)
{
    viz[nod]=1;
    for(auto it : L[nod])
        if(!viz[it]) Dfs(it);
    v[++l]=nod;
}

inline void Dfs1(int nod)
{
    marked[nod]=1;
    ans[nod]=0; ans[non(nod)]=1;
    for(auto it : T[nod])
    {
        if(marked[it]) continue;
        Dfs1(it);
    }
}

int main()
{
    int i,m,x,y,z;
    ifstream cin("party.in");
    ofstream cout("party.out");
    cin>>n>>m;
    while(m--)
    {
        cin>>x>>y>>z;
        if(!z)
        {
            L[non(x)].pb(y); T[y].pb(non(x));
            L[non(y)].pb(x); T[x].pb(non(y));
        }
        else
            if(z==1)
            {
                L[non(x)].pb(non(y)); T[non(y)].pb(non(x));
            }
            else
                if(z==2)
                {
                    L[non(y)].pb(non(x)); T[non(x)].pb(non(y));
                }
                else
                {
                    L[x].pb(non(y)); T[non(y)].pb(x);
                    L[y].pb(non(x)); T[non(x)].pb(y);
                }
    }
    for(i=1;i<=2*n;++i)
    {
        if(!viz[i]) Dfs(i);
        ans[i]=-1;
    }

    for(i=2*n;i;--i)
        if(ans[v[i]]==-1) Dfs1(v[i]);

    for(i=1;i<=n;++i)
        if(ans[i]) sol.pb(i);
    cout<<sol.size()<<"\n";
    for(auto it : sol) cout<<it<<"\n";
    return 0;
}