Cod sursa(job #2694980)

Utilizator trifangrobertRobert Trifan trifangrobert Data 11 ianuarie 2021 11:40:17
Problema Andrei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

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

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

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){
    seen[node] = seen[neg(node)] = 0;
    answer[neg(node)] = true;
    for (auto& x : revgraph[node])
        if (seen[x] == 1)
            dfs2(x);
}

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

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;
}