Cod sursa(job #2694989)

Utilizator trifangrobertRobert Trifan trifangrobert Data 11 ianuarie 2021 12:15:29
Problema Andrei Scor 100
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <bitset>
#include <vector>
#include <algorithm>

using namespace std;

const int NMAX = 200000;
int N, M;
vector <int> graph[NMAX];
vector <int> revgraph[NMAX];
bitset <NMAX> seen;
vector <int> topo;
bool answer[NMAX];

int neg(int node){
    if (node < N)
        return node + N;
    else
        return node - N;
}

void AddEdge(int x, int y){
    int negx = neg(x), negy = neg(y);
    graph[negx].push_back(y);
    graph[negy].push_back(x);
    revgraph[y].push_back(negx);
    revgraph[x].push_back(negy);
}

void dfs1(int node){
    seen[node] = 1;
    for (auto& x : graph[node])
        if (seen[x] == 0)
            dfs1(x);
    topo.push_back(node);
}

void dfs2(int node){
    answer[neg(node)] = true;
    seen[node] = seen[neg(node)] = 0;
    for (auto& x : revgraph[node])
        if (seen[x] == 1)
            dfs2(x);
}

int main(){
    ifstream fin("andrei.in");
    ofstream fout("andrei.out");
    fin >> N >> M;
    for (int i = 0;i < M;++i){
        int x, y, c;
        fin >> x >> y >> c;
        --x; --y;
        if (c == 0)
            AddEdge(x, y);
        else if (c == 1)
            AddEdge(neg(x), neg(y));
        else{
            AddEdge(neg(x), y);
            AddEdge(x, neg(y));
        }
    }
    for (int i = 0;i < 2 * N;++i)
        if (seen[i] == 0)
            dfs1(i);
    reverse(topo.begin(), topo.end());
    for (auto& i : topo)
        if (seen[i] == 1 && seen[neg(i)] == 1)
            dfs2(i);
    for (int i = 0;i < N;++i)
        fout << answer[i] << " ";
    fin.close();
    fout.close();
    return 0;
}