Pagini recente » Monitorul de evaluare | Cod sursa (job #2227636) | Cod sursa (job #2659100) | Monitorul de evaluare | Cod sursa (job #3345521)
#include <bits/stdc++.h>
using namespace std;
ifstream f("party.in");
ofstream g("party.out");
vector <int> v[200009], vt[200009];
int n;
int ctc[200009];
int cnt=0, lin[200009], curr=0;
bool viz[200009];
int get_nod (int x)
{
if (x<0)
return -x+n;
return x;
}
int neg (int x)
{
if (x>n)
return x-n;
return x+n;
}
void add (int x, int y)
{
v[x].push_back(y);
vt[y].push_back(x);
}
void imposibil (int x, int y)
{
add (x, neg(y));
add (y, neg(x));
}
void dfs0 (int nod)
{
viz[nod]=1;
for (auto y:v[nod])
if (!viz[y])
dfs0 (y);
lin[++cnt]=nod;
}
void dfs (int nod)
{
viz[nod]=1;
ctc[nod]=curr;
for (auto y:vt[nod])
if (!viz[y])
dfs (y);
}
signed main ()
{
int m;
f >> n >> m;
while (m--)
{
int x, y;
f >> x >> y;
int tip;
f >> tip;
//x=get_nod(x), y=get_nod(y);
if (tip==0)
imposibil (neg(x), neg(y));
if (tip==1)
imposibil (neg(x), y);
if (tip==2)
imposibil (neg(y), x);
if (tip==3)
imposibil (x, y);
}
for (int i=1; i<=2*n; i++)
if (!viz[i])
dfs0(i);
for (int i=1; i<=2*n; i++)
viz[i]=0;
for (int i=2*n; i>=1; i--)
{
if (!viz[lin[i]])
curr++, dfs (lin[i]);
}
vector <int> ans;
for (int i=1; i<=n; i++)
{
// cout <<ctc[i] << ' ' << ctc[i+n]<<'\n';
if (ctc[i]>ctc[i+n])
ans.push_back(i);
}
g << ans.size()<<'\n';
for (auto x:ans)
g << x << '\n';
}