Pagini recente » Cod sursa (job #2630345) | Cod sursa (job #494345) | Cod sursa (job #1189531) | Cod sursa (job #554347) | Cod sursa (job #2694987)
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 200005;
int N, M;
vector <int> graph[NMAX];
vector <int> revgraph[NMAX];
bitset <NMAX> seen;
vector <int> topo;
bool answer[NMAX];
int neg(int node){
if (node <= N)
return node + N;
else
return node - N;
}
void AddEdge(int x, int y){
int negx = neg(x), negy = neg(y);
graph[negx].push_back(y);
graph[negy].push_back(x);
revgraph[y].push_back(negx);
revgraph[x].push_back(negy);
}
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){
answer[neg(node)] = true;
seen[node] = seen[neg(node)] = 0;
for (auto& x : revgraph[node])
if (seen[x] == 1)
dfs2(x);
}
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;
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 = 1;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 = 1;i <= N;++i)
fout << answer[i] << " ";
fin.close();
fout.close();
return 0;
}