Cod sursa(job #2386246)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 22 martie 2019 13:15:59
Problema Andrei Scor 75
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("andrei.in");
ofstream g("andrei.out");
int n, m;
bitset<200002> viz, ans, comp;
vector<int>v[200002], tr[200002];
vector<int>ordine;
void dfs(int nod)
{
    viz[nod] = 1;
    for(int i = 0; i < v[nod].size(); ++i)
    {
        int vecin = v[nod][i];
        if(viz[vecin])
            continue;
        dfs(vecin);
    }
    ordine.push_back(nod);
}
int nr;
int nott(int x)
{
    if(x <= n)
        return x + n;
    else
        return x - n;
}
void dfs2(int nod)
{
    comp[nod] = 1;
    ans[nott(nod)] = 1;
    for(int i = 0; i < tr[nod].size(); ++i)
    {
        int vecin = tr[nod][i];
        if(comp[vecin])
            continue;
        dfs2(vecin);
    }
}
void addedge(int x, int y)
{
    v[x].push_back(y);
    tr[y].push_back(x);
}
void add(int a, int b)
{
    addedge(nott(a), b);
    addedge(nott(b), a);
}
int main()
{
    f >> n >> m;
    for(int i = 1; i <= m; ++i)
    {
        int a, b, c;
        f >> a >> b >> c;
        if(c == 0)
            add(a, b);
        else
            if(c == 1)
                add(nott(a), nott(b));
            else
                add(nott(a), b), add(a, nott(b));
    }
    for(int i = 1; i <= 2 * n; ++i)
        if(!viz[i])
            dfs(i);
    for(int i = ordine.size() - 1; i >= 0; --i)
    {
        int nod = ordine[i];
        if(comp[nod] == 0 && comp[nott(nod)] == 0)
            dfs2(nod);
    }
    for(int i = 1; i <= n; ++i)
        g << ans[i] << " ";
    g << '\n';
    return 0;
}