Pagini recente » Cod sursa (job #28354) | Cod sursa (job #110029) | Cod sursa (job #164720) | Cod sursa (job #18274) | Cod sursa (job #2985071)
#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';
}