Cod sursa(job #651040)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 19 decembrie 2011 17:08:35
Problema Party Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<cstdio>
#define N 1001
typedef struct nod
{int info;
struct nod *urm;}Nod;
int p[N],n,m,i,a[N],b[N],j,w[N],c[N],nr,k,z[N],d[N];
Nod *f[N],*g[N];

void add(Nod *&q,int x)
{Nod *p=new Nod;
p->info=x,p->urm=q,q=p;}

void dfs(int x)
{Nod *q=new Nod;
c[x]=1;
for(q=f[x];q;q=q->urm)
if(!c[q->info])
       dfs(q->info);
w[++nr]=x;}

void dfst(int x)
{Nod *q=new Nod;
c[x]=0;
if(p[x]==2)
       {p[x]=0;
       if(x>n)
               p[x-n]=1;
       else
               p[x+n]=1;}
for(q=g[x];q;q=q->urm)
if(c[q->info])
       dfst(q->info);}

int main()
{FILE *f1=fopen("party.in","r"),*f2=fopen("party.out","w");
fscanf(f1,"%d%d",&n,&m);
for(i=1;i<=m;i++)
       {fscanf(f1,"%d%d%d",&a[i],&b[i],&z[i]);
       if(!z[i])
              add(f[a[i]],b[i]),add(g[b[i]],a[i]);
       else
              if(z[i]==1)
                     add(f[a[i]],b[i]+n),add(g[b[i]+n],a[i]);
              else
                     if(z[i]==2)
                            add(f[a[i]+n],b[i]),add(g[b[i]],a[i]+n);
                     else
                            add(f[a[i]+n],b[i]+n),add(g[b[i]+n],a[i]+n);}
for(j=1;j<=2*n;j++)
       {p[j]=2;
       if(!c[j])
                dfs(j);}
for(i=nr;i;i--)
if(c[i])
       dfst(w[i]);
for(i=1;i<=n;i++)
if(p[i]==2)
       p[i]=0;
for(i=1;i<=m;i++)
if(!z[i]&&!p[a[i]]&&!p[b[i]])
       p[a[i]]=1;
else
       if(z[i]==1&&!p[a[i]]&&p[b[i]]==1)
              p[a[i]]=1;
       else
              if(z[i]==2&&p[a[i]]==1&&!p[b[i]])
                     p[a[i]]=0;
              else
                     if(z[i]==3&&p[a[i]]==1&&p[b[i]]==1)
                             p[a[i]]=0;
for(i=1;i<=m;i++)
if(!z[i]&&!p[a[i]]&&!p[b[i]])
       p[b[i]]=1;
else
       if(z[i]==1&&!p[a[i]]&&p[b[i]]==1)
              p[b[i]]=0;
       else
              if(z[i]==2&&p[a[i]]==1&&!p[b[i]])
                     p[b[i]]=1;
              else
                     if(z[i]==3&&p[a[i]]==1&&p[b[i]]==1)
                             p[b[i]]=0;
for(i=1,k=0;i<=n;i++)
if(p[i]==1)
       d[++k]=i;
fprintf(f2,"%d\n",k);
for(i=1;i<=k;i++)
       fprintf(f2,"%d\n",d[i]);
return 0;}