Cod sursa(job #2316563)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 11 ianuarie 2019 21:59:32
Problema Party Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.1 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("party.in");
ofstream g("party.out");

int n,m,x,y,z,i,j,k,stat[210],nut[210],niv[210],up[210],comp[210],statc[210],intr[210];
vector<int> u[210],v[210];
vector<vector<int> > C;
bitset<210> viz,in;
stack<int> St;
queue<int> Q;

void dfs(int poz)
{
    if(viz[poz])return ;
    viz[poz]=1;
    St.push(poz);in[poz]=1;
    for(auto it:v[poz])
        if(!viz[it])
        {
            up[it]=niv[it]=++k;
            dfs(it);
            up[poz]=min(up[poz],up[it]);
        }
        else
            if(in[it])
                up[poz]=min(up[poz],niv[it]);
    if(up[poz]==niv[poz])
    {
        vector<int> c;
        while(St.top()!=poz)
        {
            in[St.top()]=0;
            c.push_back(St.top());
            St.pop();
        }
        St.pop();
        in[poz]=0;
        c.push_back(poz);
        C.push_back(c);
    }
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
        nut[i]=i+n,nut[i+n]=i;
    for(;m;m--)
    {
        f>>x>>y>>z;
        if(!z)
            v[nut[x]].push_back(y),
            v[nut[y]].push_back(x);
        if(z==1)
            v[nut[x]].push_back(nut[y]);
        if(z==2)
            v[nut[y]].push_back(nut[x]);
        if(z==3)
            v[x].push_back(nut[y]),
            v[y].push_back(nut[x]);
    }
//    for(i=1;i<=2*n;i++)
//    {
//        g<<i<<": ";
//        for(auto it:v[i])
//            g<<it<<' ';
//        g<<'\n';
//    }g<<'\n';
    for(i=1;i<=2*n;i++)
        if(!viz[i])
        {
            niv[i]=up[i]=++k;
            dfs(i);
        }
//    for(auto it:C)
//    {
//        for(auto that:it)
//            g<<that<<' ';
//        g<<'\n';
//    }g<<'\n';
    for(i=0;i<C.size();i++)
        for(auto it:C[i])
            comp[it]=i;
    for(i=0;i<C.size();i++)
    {
        viz.reset();
        for(auto it:C[i])
            for(auto that:v[i])
                if(!viz[comp[that]])
                    u[i].push_back(comp[that]),viz[comp[that]]=1,intr[comp[that]]++;
    }
//    for(i=0;i<C.size();i++)
//        cout<<i<<" : "<<C[i][0]<<' '<<intr[i]<<'\n';
    for(i=0;i<C.size();i++)
        if(!intr[i])
            Q.push(i);
    for(i=1;i<=2*n;i++)stat[i]=statc[i]=-1;
    while(Q.size())
    {
        i=Q.front();Q.pop();
//        cout<<i<<' ';
        for(auto it:u[i])
        {
            intr[it]--;
            if(!intr[it])
                Q.push(it);
        }
        for(auto it:C[i])
            if(stat[it]!=-1)
            {
                statc[i]=stat[it];
                break;
            }
        if(statc[i]==-1)
            statc[i]=0;
        for(auto it:C[i])
            stat[it]=statc[i],stat[nut[it]]=1-statc[i];
        if(statc[i])
            for(auto it:u[i])
                statc[it]=1;
//        for(i=1;i<=2*n;i++)
//            g<<i<<' '<<stat[i]<<'\n';g<<'\n';
    }
    int ans=0;
    for(i=1;i<=n;i++)
        if(stat[i])
            ans++;
    g<<ans<<'\n';
    for(i=1;i<=n;i++)
        if(stat[i])
            g<<i<<'\n';
    return 0;
}