Cod sursa(job #1104)

Utilizator alextheroTandrau Alexandru alexthero Data 12 decembrie 2006 18:31:01
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.39 kb
#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;
}