Cod sursa(job #1118155)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 24 februarie 2014 01:14:51
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>

#include <cstring>
using namespace std;

const int MAX_N = 100002;

int N, M;
vector < int > v[2 * MAX_N], w[2 * MAX_N], a;
bool m[2 * MAX_N], sol[2 * MAX_N];

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

inline void addEdges(int x, int y) {
    v[neg(x)].push_back(y);
    v[neg(y)].push_back(x);

    w[x].push_back(neg(y));
    w[y].push_back(neg(x));
}

void DFS1(int x) {
    m[x] = 1;
    for(size_t i = 0; i < v[x].size(); ++i)
        if(m[v[x][i]] == 0)
            DFS1(v[x][i]);
    a.push_back(x);
}

void DFS2(int x) {
    m[x] = 1;
    sol[neg(x)] = 1;
    for(size_t i = 0; i < w[x].size(); ++i)
        if(m[w[x][i]] == 0)
            DFS2(w[x][i]);
}

int main() {
    ifstream f("andrei.in");
    ofstream g("andrei.out");

    f >> N >> M;
    for(int i = 1, x, y, t; i <= M; ++i) {
        f >> x >> y >> t;

        if(t == 0)
            addEdges(x, y);
        else if(t == 1)
            addEdges(neg(x), neg(y));
        else addEdges(neg(x), y), addEdges(x, neg(y));
    }

    for(int i = 1; i <= 2 * N; ++i)
        if(m[i] == 0)
            DFS1(i);

    memset(m, 0, sizeof(m));
    for(int i = a.size() - 1; i >= 0; --i)
        if(m[a[i]] == 0 && m[neg(a[i])] == 0)
            DFS2(a[i]);

    for(int i = 1; i <= N; ++i)
        g << sol[i] << " ";
    g << "\n";

    f.close();
    g.close();

    return 0;
}