Pagini recente » Cod sursa (job #2683056) | Cod sursa (job #216045) | Cod sursa (job #1934053) | bkt2_oct2011 | Cod sursa (job #1649481)
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 100005;
//12:23
vector <int> graph[2 * NMAX];
vector <int> graph_inv[2 * NMAX];
#define graph (graph + NMAX)
#define graph_inv (graph_inv + NMAX)
void add_edge(int a, int b) {
graph[-a].push_back(b);
graph[-b].push_back(a);
graph_inv[a].push_back(-b);
graph_inv[b].push_back(-a);
}
int h[2 * NMAX];
bool vis[2 * NMAX];
#define vis (vis + NMAX)
int pos;
void dfs_inv(int node) {
vis[node] = true;
for (auto it: graph_inv[node])
if (!vis[it])
dfs_inv(it);
h[++ pos] = node;
}
int which_comp[2 * NMAX];
#define which_comp (which_comp + NMAX)
void dfs(int node, int comp) {
vis[node] = true;
which_comp[node] = comp;
for (auto it: graph[node])
if (!vis[it])
dfs(it, comp);
}
int col[2 * NMAX];
#define col (col + NMAX)
int main()
{
ifstream cin("andrei.in");
ofstream cout("andrei.out");
int n, m = 0;
cin >> n >> m;
int a, b, type;
while (m --) {
cin >> a >> b >> type;
if (type == 0)
add_edge(a, b);
else if (type == 1)
add_edge(-a, -b);
else {
add_edge(-a, b);
add_edge(-b, a);
}
}
for (int i = -n; i <= n; ++ i)
if (i)
dfs_inv(i);
for (int i = -n; i <= n; ++ i)
vis[i] = 0;
for (int i = 1; i <= pos; ++ i)
if (!vis[h[i]]) {
vis[h[i]] = true;
vis[-h[i]] = true;
col[h[i]] = 1;
}
for (int i = 1; i <= n; ++ i)
cout << col[i] << " \n"[i == n];
cin.close();
cout.close();
return 0;
}