Cod sursa(job #1907181)

Utilizator LucianTLucian Trepteanu LucianT Data 6 martie 2017 18:10:09
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
#define maxN 205
using namespace std;
bool in_stk[maxN];
int sol[maxN];
int n,m,i,j,x,y,z;
int stk[maxN],top,cntscc;
int low[maxN],idx[maxN],curr,scc[maxN];
vector<int> v[maxN],invite;
inline int opposite(int x)
{
    if(x>n)
        return x-n;
    return x+n;
}
void tarjan(int nod)
{
    low[nod]=idx[nod]=++curr;
    stk[++top]=nod;
    in_stk[nod]=true;

    for(auto it:v[nod]) /* updating lowlink */
        if(!idx[it]){
            tarjan(it);
            low[nod]=min(low[nod],low[it]);
        }
        else if(in_stk[it])
            low[nod]=min(low[nod],idx[it]);

    if(low[nod]==idx[nod]) /* new scc */
    {
        int newn;
        ++cntscc;
        do
        {
            newn=stk[top--];
            in_stk[newn]=false;
            scc[newn]=cntscc;
            if(!sol[newn])
                sol[newn]=1,sol[opposite(newn)]=-1; /*assigning values */
        }while(nod!=newn);
    }
}
int main()
{
    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); /* building graph according to the info */
        if(z==0)
            v[opposite(x)].push_back(y),v[opposite(y)].push_back(x);
        if(z==1)
            v[opposite(x)].push_back(opposite(y)),v[y].push_back(x);
        if(z==2)
            v[opposite(y)].push_back(opposite(x)),v[x].push_back(y);
        if(z==3)
            v[x].push_back(opposite(y)),v[y].push_back(opposite(x));
    }
    for(i=1;i<=n;i++) /* finding sccs */
        if(!idx[i])
            tarjan(i);
    for(i=1;i<=n;i++)
        if(sol[i]==1)
            invite.push_back(i);
    printf("%d\n",invite.size());
    for(auto it:invite)
        printf("%d ",it);
    return 0;
}