Cod sursa(job #1132045)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 2 martie 2014 15:08:36
Problema Party Scor 30
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 1.56 kb
#include<cstdio>
#include<vector>

using namespace std;

typedef pair<int,int> PII;
const int NMAX = 100+5;
const int MMAX = 1000+5;

int N,M;
int Sol[NMAX];
int Viz[NMAX];
vector<PII> V[NMAX];

int Valoare(int x,int y,int z)
{
    if(Sol[x]==1 && z==2) return 1;
    if(Sol[x]==1 && z==3) return 0;
    if(Sol[x]==0 && z==0) return 1;
    if(Sol[x]==0 && z==1) return 0;
    return 2;
}

int Fixeaza(int x)
{
    int y,z,v;
    vector<PII>::iterator it;
    for(it=V[x].begin(); it!=V[x].end(); it++)
    {
        y=it->first;
        z=it->second;
        v=Valoare(x,y,z);
        if(v==2) continue;
        if(Viz[y] && v!=Sol[y]) break;
        if(!Viz[y])
        {
            Sol[y]=Valoare(x,y,z);
            Viz[y]=Viz[x];
            Fixeaza(y);
        }
    }
    return it==V[x].end();
}

int main()
{
    int i,j,x,y,z,ans=0;

    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);
        V[x].push_back(make_pair(y,z));
        V[y].push_back(make_pair(x,z));
    }

    for(i=1; i<=N; i++)
    {
        if(Viz[i]) continue;

        Sol[i]=1;
        Viz[i]=i;
        if(Fixeaza(i)) continue;

        for(j=1; j<=N; j++)
            if(Viz[j]==i) Viz[j]=0;

        Sol[i]=0;
        Viz[i]=i;
        if(Fixeaza(i)) continue;
    }

    for(i=1; i<=N; i++)
        ans+=Sol[i];

    printf("%d\n",ans);
    for(i=1; i<=N; i++)
        if(Sol[i]) printf("%d\n",i);

    return 0;
}