Pagini recente » Cod sursa (job #2442175) | Cod sursa (job #2888087) | Cod sursa (job #2180552) | Cod sursa (job #265439) | Cod sursa (job #1118155)
#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;
}