Pagini recente » Cod sursa (job #358378) | Cod sursa (job #472602) | Cod sursa (job #1823278) | Cod sursa (job #2797833) | Cod sursa (job #744378)
Cod sursa(job #744378)
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
const int SIZE = 100002;
int N, M;
vector<int> V1[2 * SIZE], V2[2 * SIZE];
bool S[2 * SIZE], result[2 * SIZE];
int st[2 * SIZE];
inline int rev(int x)
{
return x + (x <= N ? 1 : -1) * N;
}
inline void add_edge(int nod1, int nod2)
{
V1[rev(nod2)].push_back(nod1);
V1[rev(nod1)].push_back(nod2);
V2[nod1].push_back(rev(nod2));
V2[nod2].push_back(rev(nod1));
}
void Dfs1(int x)
{
S[x] = true;
for (vector<int>::iterator it = V1[x].begin(); it != V1[x].end(); ++it)
if (!S[*it])
Dfs1(*it);
st[++st[0]] = x;
}
void Dfs2(int x)
{
S[x] = true;
result[rev(x)] = true;
for (vector<int>::iterator it = V2[x].begin(); it != V2[x].end(); ++it)
if (!S[*it])
Dfs2(*it);
}
int main()
{
ifstream fin("andrei.in");
ofstream fout("andrei.out");
fin >> N >> M;
for (int i = 1, nod1, nod2, value; i <= M; ++i)
{
fin >> nod1 >> nod2 >> value;
if (value == 0)
add_edge(nod1, nod2);
if (value == 1)
add_edge(rev(nod1), rev(nod2));
if (value == 2)
{
add_edge(rev(nod1), nod2);
add_edge(nod1, rev(nod2));
}
}
for (int i = 1; i <= 2 * N; ++i)
if (!S[i])
Dfs1(i);
memset(S, 0, sizeof(S));
for (int i = 2 * N; i >= 1; --i)
if (!result[st[i]] && !result[rev(st[i])])
Dfs2(st[i]);
for (int i = 1; i <= N; ++i)
fout << !result[i] << ' ';
fout << '\n';
fin.close();
fout.close();
}