Pagini recente » Cod sursa (job #1697465) | Cod sursa (job #1768690) | Cod sursa (job #2920432) | Cod sursa (job #1898686) | Cod sursa (job #2386223)
#include<bits/stdc++.h>
using namespace std;
ifstream f("andrei.in");
ofstream g("andrei.out");
int n, m;
bool pus[200002], viz[200002], ans[200002];
int comp[200002];
vector<int>v[200002], tr[200002];
vector<int>ordine;
void dfs(int nod)
{
viz[nod] = 1;
for(int i = 0; i < v[nod].size(); ++i)
{
int vecin = v[nod][i];
if(viz[vecin])
continue;
dfs(vecin);
}
ordine.push_back(nod);
}
int nr;
void dfs2(int nod)
{
comp[nod] = nr;
for(int i = 0; i < tr[nod].size(); ++i)
{
int vecin = tr[nod][i];
if(comp[vecin])
continue;
dfs2(vecin);
}
}
int nott(int x)
{
if(x <= n)
return x + n;
else
return x - n;
}
void add(int a, int b)
{
v[nott(a)].push_back(b);
tr[b].push_back(nott(a));
v[nott(b)].push_back(a);
tr[a].push_back(nott(b));
}
int main()
{
f >> n >> m;
for(int i = 1; i <= m; ++i)
{
int a, b, c;
f >> a >> b >> c;
if(c == 0)
add(a, b);
else
if(c == -1)
add(not(a), not(b));
else
add(not(a), b), add(a, not(b));
}
for(int i = 2; i <= 2 * n + 1; ++i)
if(!viz[i])
dfs(i);
reverse(ordine.begin(), ordine.end());
for(int i = 0; i < ordine.size(); ++i)
{
int nod = ordine[i];
if(!comp[nod])
++nr, dfs2(nod);
}
for(int i = 1; i <= n; ++i)
g << (comp[i * 2] > comp[i * 2 + 1]) << " ";
return 0;
}