Cod sursa(job #2877199)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 24 martie 2022 12:10:19
Problema Party Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
ifstream f("party.in");
ofstream g("party.out");
vector <int> c[211];
int nr,fam[211];
stack <int> stk;
bool instk[211];
void ctc(int k)
{
    int t;
    nr++;
    while(t!=k)
    {
        t=stk.top();
        stk.pop();
        c[nr].push_back(t);
        fam[t]=nr;
        instk[t]=0;
    }
}
int index,when[211],low[211];
vector <int> v[211];
void tarjan(int k)
{
    index++;
    when[k]=low[k]=index;
    stk.push(k);
    instk[k]=1;
    for(auto it=v[k].begin();it!=v[k].end();it++)
        if(when[*it]==0)
        {
            tarjan(*it);
            low[k]=min(low[k],low[*it]);
        }
        else
            if(instk[*it]==1)
                low[k]=min(low[k],low[*it]);
    if(when[k]==low[k])
        ctc(k);
}
queue <int> q;
bool muc[211][211];
int n,m,i,x,y,z,C,sol[211],S,grad[211],k,p;
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>C>>x>>y;
        if(x!=y)
        {
        if(C==1 && muc[x+n][y+n]==0)
        {
            muc[x+n][y+n]=1;
            v[x+n].push_back(y+n);
        }
        else
        if(C==2 && muc[y+n][x+n]==0)
        {
            muc[y+n][x+n]=1;
            v[y+n].push_back(x+n);
        }
        else
        {
            if(muc[x][y+n]==0)
            {
                muc[x][y+n]=1;
                v[x].push_back(y+n);
            }
            if(muc[y][x+n]==0)
            {
                muc[y][x+n]=1;
                v[y].push_back(x+n);
            }
        }
        }
    }
    for(i=1;i<=2*n;i++)
    {
        sol[i]=-1;
        if(fam[i]==0)
        tarjan(i);
    }
    for(i=1;i<=2*n;i++)
        for(auto it=v[i].begin();it!=v[i].end();it++)
            if(fam[i]!=fam[*it])
                grad[fam[*it]]++;
    for(i=1;i<=nr;i++)
        if(grad[i]==0)
            q.push(i);
    while(q.empty()==false)
    {
        k=q.front();
        q.pop();
        for(auto it=c[k].begin();it!=c[k].end();it++)
        {
            z=*it;
            if(z>n)
                z=z-n;
            if(sol[z]==-1)
            {
                if(*it>n)
                    sol[z]=0;
                else
                    sol[z]=1;
            }
        }
        for(auto it=c[k].begin();it!=c[k].end();it++)
            for(auto j=v[*it].begin();j!=v[*it].end();j++)
        {
            if(fam[*it]!=fam[*j])
            {
                grad[fam[*j]]--;
                if(grad[fam[*j]]==0)
                    q.push(fam[*j]);
            }
        }
    }
    for(i=1;i<=n;i++)
        if(sol[i]==1)
        S++;
    p=1;
    if(S==0)
    {
        S=n;
        p=0;
    }
    g<<S<<'\n';
    for(i=1;i<=n;i++)
        if(sol[i]==p)
        g<<i<<'\n';
    return 0;
}