Cod sursa(job #1118148)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 24 februarie 2014 00:59:14
Problema Andrei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <vector>

#include <cstring>
using namespace std;

const int MAX_N = 100002;

int N, M;
int c[2 * MAX_N], sol[2 * MAX_N];
vector < int > v[2 * MAX_N], w[2 * MAX_N], scc[2 * MAX_N], a;
bool m[2 * MAX_N], s[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, int nr) {
    m[x] = 1;
    c[x] = nr;
    scc[nr].push_back(x);
    for(size_t i = 0; i < w[x].size(); ++i)
        if(m[w[x][i]] == 0)
            DFS2(w[x][i], nr);
}

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));
    int nr = 0;
    for(int i = a.size() - 1; i >= 0; --i)
        if(m[a[i]] == 0) {
            ++nr;
            DFS2(a[i], nr);
        }

    for(int i = nr; i >= 1; --i) {
        if(s[i])
            continue;

        for(size_t j = 0; j < scc[i].size(); ++j) {
            int x = scc[i][j];

            sol[x] = 1;
            s[c[neg(x)]] = 1;
        }
    }

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

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

    return 0;
}