Cod sursa(job #3278764)

Utilizator tudor_costinCostin Tudor tudor_costin Data 20 februarie 2025 18:20:39
Problema Party Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("party.in");
ofstream fout("party.out");
const int Nmax=205;
vector<int> v[Nmax],inv[Nmax];
bitset<Nmax> viz,ans;
vector<int> topo;
int n;
bool ok=true;
int neg(int x)
{
    if(x>n) return x-n;
    else return x+n;
}
void dfs(int nod)
{
    viz[nod]=1;
    for(int u:v[nod])
    {
        if(!viz[u]) dfs(u);
    }
    topo.push_back(nod);
}
void dfs2(int nod)
{
    viz[nod]=1;
    if(ans[nod]==1) ok=false;
    ans[neg(nod)]=1;
    for(int u:inv[nod])
    {
        if(!viz[u]) dfs2(u);
    }
}
int main()
{
    int m;
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int t,x,y;
        fin>>x>>y>>t;
        if(t==0)
        {
            v[neg(x)].push_back(y);
            v[neg(y)].push_back(x);
            inv[x].push_back(neg(y));
            inv[y].push_back(neg(x));
        }
        if(t==1)
        {
            v[neg(x)].push_back(neg(y));
            inv[neg(y)].push_back(neg(x));
        }
        if(t==2)
        {
            inv[neg(x)].push_back(neg(y));
            v[neg(y)].push_back(neg(x));
        }
        if(t==3)
        {
            inv[neg(x)].push_back(y);
            inv[neg(y)].push_back(x);
            v[x].push_back(neg(y));
            v[y].push_back(neg(x));
        }
    }
    for(int i=1;i<=2*n;i++)
    {
        if(!viz[i]) dfs(i);
    }
    viz.reset();
    reverse(topo.begin(),topo.end());
    for(int x:topo)
    {
        if(viz[x]) continue;
        if(!ans[x] && !ans[neg(x)]) dfs2(x);
    }
    vector<int> sol;
    for(int i=1;i<=n;i++) if(ans[i]) sol.push_back(i);
    fout<<sol.size()<<'\n';
    for(int x:sol) fout<<x<<'\n';
    return 0;
}