Cod sursa(job #2386210)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 22 martie 2019 12:45:49
Problema Andrei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("andrei.in");
ofstream g("andrei.out");
int n, m;
bool pus[200002], viz[200002];
int comp[200002];
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;
void dfs2(int nod)
{
    comp[nod] = nr;
    for(int i = 0; i < tr[nod].size(); ++i)
    {
        int vecin = tr[nod][i];
        if(comp[vecin])
            continue;
        dfs2(vecin);
    }
}
int main()
{
    f >> n >> m;
    for(int i = 1; i <= m; ++i)
    {
        int a, b, c;
        f >> a >> b >> c;
        if(c == 2)
        {
            a *= -1;
            int nega = (a < 0);
            int negb = (b < 0);
            if(a < 0)
                a *= -1;
            if(b < 0)
                b *= -1;
            v[a * 2 + (!nega)].push_back(b * 2 + negb);
            v[b * 2 + (!negb)].push_back(a * 2 + nega);
            tr[b * 2 + negb].push_back(a * 2 + (!nega));
            tr[a * 2 + nega].push_back(b * 2 + (!negb));
            a *= -1;
            b *= -1;
            nega = (a < 0);
            negb = (b < 0);
            if(a < 0)
                a *= -1;
            if(b < 0)
                b *= -1;
            v[a * 2 + (!nega)].push_back(b * 2 + negb);
            v[b * 2 + (!negb)].push_back(a * 2 + nega);
            tr[b * 2 + negb].push_back(a * 2 + (!nega));
            tr[a * 2 + nega].push_back(b * 2 + (!negb));
        }
        if(c == 1)
        {
            a *= -1;
            b *= -1;
        }
        int nega = (a < 0);
        int negb = (b < 0);
        if(a < 0)
            a *= -1;
        if(b < 0)
            b *= -1;
        v[a * 2 + (!nega)].push_back(b * 2 + negb);
        v[b * 2 + (!negb)].push_back(a * 2 + nega);
        tr[b * 2 + negb].push_back(a * 2 + (!nega));
        tr[a * 2 + nega].push_back(b * 2 + (!negb));
    }
    for(int i = 2; i <= 2 * n + 1; ++i)
        if(!viz[i])
            dfs(i);
    reverse(ordine.begin(), ordine.end());
    for(int i = 0; i < ordine.size(); ++i)
    {
        int nod = ordine[i];
        if(!comp[nod])
            ++nr, dfs2(nod);
    }
    for(int i = 1; i <= n; ++i)
        g << (comp[i * 2] > comp[i * 2 + 1]) << " ";
    return 0;
}