Cod sursa(job #2985071)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 25 februarie 2023 16:52:52
Problema Party Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;

ifstream cin("party.in");
ofstream cout("party.out");

const int NMAX = 2e5 + 1;

int m;

vector<int> vecini[NMAX],t[NMAX],topo;
bool viz[NMAX]; int care[NMAX],e;

void dfs(int nod)
{
    viz[nod] = 1;
    for(auto it : vecini[nod])
        {
            if(viz[it]) continue;
            dfs(it);
        }

    topo.emplace_back(nod);
}

int getint()
{
    int x; cin >> x; return x;

}


int negativ(int x)
{
    return x > m ? x - m : x + m;
}

void cauta(int nod)
{
    care[nod] = e;
    for(auto it : t[nod])
        {
            if(care[it]) continue;
            cauta(it);
        }
}


int main()
{
    int n,x; cin >> m >> n;
    for(int i = 1; i <= n ; i++)
        {
           int a,b,c; a = getint(); b = getint(); c = getint();

           if(c == 1) b += m;
           else if(c == 2) a += m;
           else if(c == 3)
            {
                a += m;
                b += m;
            }

           vecini[negativ(a)].emplace_back(b);
           vecini[negativ(b)].emplace_back(a);
           t[b].emplace_back(negativ(a));
           t[a].emplace_back(negativ(b));

        }

    for(int i = 1; i <= 2 * m ; i++)
        {
            if(viz[i]) continue;
            dfs(i);
        }

    for(auto it = topo.rbegin() ; it != topo.rend() ; it++)
        {
            if(care[*it]) continue;
            e++; cauta(*it);
        }

   vector<int> party; bool ok = true;
    for(int i = 1; i <= m ; i++)
        {
            if(care[i] > care[i + m]) party.emplace_back(i);
        }

    cout << party.size() << '\n';
    for(auto it : party) cout << it << '\n';


}