Cod sursa(job #2791918)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 31 octombrie 2021 13:46:31
Problema Party Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("party.in");
ofstream fout("party.out");
const int NMAX = 1005;
int n,m,x,y,rasp[2*NMAX],low[2*NMAX],nivel[2*NMAX],k,z;
bool ver[2*NMAX],NU_EXISTA;
vector <int> v[2*NMAX];
stack <int> q;
set <int> s;
int opus(int node){
    if(node<0) return -node;
    if(node<NMAX) return node+NMAX;
    return node-NMAX;
}
void dfs(int node){
    q.push(node);
    ver[node]=true;
    low[node]=nivel[node]=++k;
    for(int i=0;i<v[node].size();i++){
        int vecin=v[node][i];
        if(nivel[vecin]==0){
            dfs(vecin);
            if(low[vecin]<low[node])
                low[node]=low[vecin];
        } else if(ver[vecin]!=0){
            if(nivel[vecin]<low[node])
                low[node]=nivel[vecin];
        }
    }
    if(nivel[node]==low[node]){
        s.clear();
        int n2=0;
        while(n2!=node){
            n2=q.top();
            q.pop();
            ver[n2]=false;
            s.insert(n2);
            if(rasp[n2]==0){
                rasp[n2]=1;
                rasp[opus(n2)]=-1;
            }
        }
    }
}

int nod_(int node){
    if(node<0) return NMAX-node;
    return node;
}

void add_(int x,int y){
    x=nod_(x);
    y=nod_(y);
    v[x].push_back(y);
}

void citire(){
    fin >> n >> m;
    for(int i=1;i<=m;i++){
        fin >> x >> y >> z;
        if(z==1){ y=-y; }
        if(z==2){ x=-x; }
        if(z==3){ x=-x,y=-y; }
        add_(-x,y);
        add_(-y,x);
    }
}
void solve(){
    for(int i=1;i<=n;i++){
        if(nivel[i]==0) dfs(i);
    }
    for(int i=1;i<=n;i++){
        if(nivel[i+NMAX]==0) dfs(i+NMAX);
    }
}
void afis(){
    int rasp_dim=0;
    for(int i=1;i<=n;i++){
        if(rasp[i]==1) rasp_dim++;
    }
    fout << rasp_dim << '\n';
    for(int i=1;i<=n;i++){
        if(rasp[i]==1) fout << i << '\n';
    }
}
int main()
{
    citire();
    solve();
    afis();
    return 0;
}