Pagini recente » Cod sursa (job #1378979) | Cod sursa (job #3040731) | Cod sursa (job #1752869) | Cod sursa (job #2869827) | Cod sursa (job #1104)
Cod sursa(job #1104)
#include <stdio.h>
#include <algorithm>
#define nmax 105
using namespace std;
int n,m,x,y,o,i,j,timp,ma[2*nmax][2*nmax],a[2*nmax][2*nmax],viz[2*nmax];
int pot[2*nmax][2*nmax],bun[2*nmax][2*nmax],cate,scc[2*nmax][2*nmax],st[2*nmax];
int val[2*nmax],ma1[2*nmax][2*nmax];
int stiv[2*nmax];
int negat(int x) {
if(x>n) return x-n;
else return x+n;
}
void bfs(int nod) {
for(int j=1;j<=2*nmax;j++) viz[j]=0;
int q=1,p=1;
stiv[1]=nod;
viz[1]=1;
while(q<=p) {
for(int i=1;i<=a[stiv[q]][0];i++) {
int n1=a[stiv[q]][i];
if(!viz[n1]) {
pot[nod][++pot[nod][0]]=n1;
bun[nod][n1]=1;
stiv[++p]=n1;
viz[n1]=1;
}
}
q++;
}
}
void ca_viz(int nod) {
viz[nod]=1;
for(int i=1;i<=ma1[nod][0];i++) {
if(!viz[ma1[nod][i]]) ca_viz(ma1[nod][i]);
}
st[++st[0]]=nod;
}
void sortare_topologica() {
for(int i=1;i<=cate;i++) viz[i]=0;
for(int i=1;i<=cate;i++)
if(!viz[i]) ca_viz(i);
}
int main() {
freopen("party.in","r",stdin);
freopen("party.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(int i=1;i<=m;i++) {
scanf("%d %d %d\n",&x,&y,&o);
if(o==0) {
ma[negat(x)][y]=1;
ma[negat(y)][x]=1;
a[negat(x)][++a[negat(x)][0]]=y;
a[negat(y)][++a[negat(y)][0]]=x;
}
if(o==1) {
ma[negat(x)][negat(y)]=1;
ma[y][x]=1;
a[negat(x)][++a[negat(x)][0]]=negat(y);
a[y][++a[y][0]]=x;
}
if(o==2) {
ma[x][y]=1;
ma[negat(y)][negat(x)]=1;
a[negat(y)][++a[negat(y)][0]]=negat(x);
a[x][++a[x][0]]=y;
}
if(o==3) {
ma[x][negat(y)]=1;
ma[y][negat(x)]=1;
a[x][++a[x][0]]=negat(y);
a[y][++a[y][0]]=negat(x);
}
}
for(int i=1;i<=2*n;i++) bfs(i);
cate=0;
for(int i=1;i<=2*n;i++) {
int gata=0;
for(int j=1;j<=cate;j++)
if((bun[scc[j][1]][i]) && (bun[i][scc[j][1]])) {
scc[j][++scc[j][0]]=i;
gata=1;
break;
}
if(!gata) {
cate++;
scc[cate][++scc[cate][0]]=i;
}
}
for(int i=1;i<=cate;i++)
for(int j=1;j<=cate;j++)
if(i!=j) {
int bagam=0;
for(int k=1;k<=scc[i][0];k++) {
for(int k1=1;k1<=scc[j][0];k1++)
if(ma[scc[i][k]][scc[j][k1]]) {
bagam=1;
break;
}
if(bagam) break;
}
if(bagam)
ma1[i][++ma1[i][0]]=j;
}
sortare_topologica();
for(int i=1;i<=st[0];i++) {
int nod=st[i];
for(int j=1;j<=scc[st[i]][0];j++) {
nod=scc[st[i]][j];
if(val[negat(nod)]==0) {
val[nod]=1;
val[negat(nod)]=2;
}
}
}
int cate1=0;
for(int i=1;i<=n;i++) if(val[i]==1) cate1++;
if(cate1==0) {
printf("%d\n",n);
for(int i=1;i<=n;i++) printf("%d\n",i);
return 0;
}
printf("%d\n",cate1);
for(int i=1;i<=n;i++) if(val[i]==1) printf("%d\n",i);
return 0;
}