Pagini recente » Cod sursa (job #2641592) | Cod sursa (job #2131072) | Cod sursa (job #2744112) | Cod sursa (job #722636) | Cod sursa (job #477124)
Cod sursa(job #477124)
#include <cstdio>
#define DM 2005
bool ok=true,viz[DM];
int sol[DM],ord[DM],n,m,nr;
struct nod {
int x;
nod *urm;
} *g[DM],*gt[DM];
inline int non (int a) {
return (a>n)?a-n:a+n;
}
void adaugare(int x, int y, bool z) {
nod *p;
p=new nod;
p->x=y;
if(z) {
p->urm=g[x];
g[x]=p;
}else {
p->urm=gt[x];
gt[x]=p;
}
}
void dfs(int sursa) {
nod *p;
if(viz[sursa]) return;
viz[sursa]=true;
for(p=g[sursa];p!=NULL; p=p->urm)
if(!viz[p->x]) dfs(p->x);
ord[++nr]=sursa;
}
void dfs_2(int sursa) {
nod *p;
if(!viz[sursa]) return;
viz[sursa]=false;
sol[non(sursa)]=1;
for(p=gt[sursa];p!=NULL; p=p->urm)
if(viz[p->x]) dfs_2(p->x);
}
int main()
{
int x,y,z,i;
freopen("party.in","r",stdin);
freopen("party.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1; i<=m; ++i) {
scanf("%d %d %d",&x,&y,&z);
if(z==1) y+=n;
else if(z==2) x+=n;
else if(z==3) y+=n,x+=n;
adaugare(non(x),y,true);
adaugare(non(y),x,true);
adaugare(y,non(x),false);
adaugare(x,non(y),false);
}
for(i=1; i<=n+n; ++i) if(!viz[i]) dfs(i);
for(i=1; i<=n+n; ++i) if(viz[ord[i]] && viz[non(ord[i])]) dfs_2(ord[i]);
nr=0;
for(i=1; i<=n; ++i) if(sol[i]) ++nr;
printf("%d\n",nr);
for(i=1; i<=n; ++i) if(sol[i]) printf("%d\n",i);
return 0;
}