Cod sursa(job #2311862)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 3 ianuarie 2019 19:36:03
Problema Party Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
#define N 205

using namespace std;

ifstream fin("party.in") ;
ofstream fout("party.out") ;

vector<int> graf[N] ;
vector<int> graft[N] ;
vector<int> ord , sol ;
bitset<N> bt ;
int n , m , rng[N] , cmp ;

void add(int x , int y)
{
    graf[x].push_back(y) ;
    graft[y].push_back(x) ;
}

void citire()
{
    int x , y , tp , i ;
    fin >> n >> m ;
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> x >> y >> tp ;
        if ( tp == 0 )
            add(n+x,y) , add(n+y,x) ;
        else if ( tp == 1 )
            add(n+x,n+y) , add(y,x) ;
        else if ( tp == 2 )
            add(x,y) , add(n+y,n+x) ;
        else
            add(x,n+y) , add(y,n+x) ;
    }
}

void dfs(int nod)
{
    bt[nod] = 1 ;
    for ( auto vec : graf[nod] )
        if ( bt[vec] == 0 )
            dfs(vec) ;
    ord.push_back(nod);
}

void dfst(int nod)
{
    rng[nod] = cmp ;
    for ( auto vec : graft[nod] )
        if ( rng[vec] == 0 )
            dfst(vec) ;
}

int main()
{
    int i ;
    citire() ;
    for ( i = 1 ; i <= 2*n ; i++ )
        if ( bt[i] == 0 )
            dfs(i) ;
    reverse(ord.begin(),ord.end()) ;
    cmp = 1 ;
    for ( auto vv : ord )
        if ( rng[vv] == 0 )
            dfst(vv) , cmp++ ;
    for ( i = 1 ; i <= n ; i++ )
        if ( rng[i] > rng[n+i] )
            sol.push_back(i) ;
    fout << sol.size() << '\n' ;
    for ( auto vv : sol )
        fout << vv << '\n' ;
}