Pagini recente » Cod sursa (job #1472120) | Cod sursa (job #663228) | Cod sursa (job #246900) | Cod sursa (job #1204104) | Cod sursa (job #593357)
Cod sursa(job #593357)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 110
int n, m, tip, nod, nc, x, y, i, j, k, nr;
int f[maxn], ctc[maxn], s[maxn], s2[maxn], t[maxn];
vector<int> v[maxn], inv[maxn];
int nt(int x)
{
return (x+n)%(2*n);
}
void add(int x, int y)
{
v[nt(x)].push_back(y);
v[nt(y)].push_back(x);
inv[y].push_back(nt(x));
inv[x].push_back(nt(y));
}
void df1(int nod)
{
if(f[nod])
return;
f[nod]=1;
for(int i=0; i<v[nod].size(); ++i)
df1(v[nod][i]);
s[++s[0]]=nod;
}
void df2(int comp, int nod)
{
if(f[nod])
return;
f[nod]=1;
ctc[nod]=comp;
for(int i=0; i<inv[nod].size(); ++i)
df2(comp, inv[nod][i]);
s2[++s2[0]]=nod;
}
int main()
{
freopen("party.in", "r", stdin);
freopen("party.out", "w", stdout);
scanf("%d%d", &n, &m);
while(m--)
{
scanf("%d%d%d", &x, &y, &tip);
--x; --y;
if(tip&1)
y=nt(y);
if(tip&2)
x=nt(x);
add(x, y);
}
for(int i=0; i<2*n; ++i)
if(!f[i])
df1(i);
memset(f, 0, sizeof(f));
for(int i=2*n; i; --i)
{
t[i-1]=2;
if(!f[s[i]])
df2(++nc, s[i]);
}
for(int i=2*n; i; --i)
{
nod=s2[i];
if(t[ctc[nod]]!=2)
continue;
t[ctc[nod]]=0;
t[ctc[nt(nod)]]=1;
}
nr=0;
for(int i=0; i<n; ++i)
nr+=t[ctc[i]];
printf("%d\n", nr);
for(int i=0; i<n; ++i)
if(t[ctc[i]])
printf("%d\n", i+1);
return 0;
}