Pagini recente » Cod sursa (job #1161620) | Cod sursa (job #185059) | Cod sursa (job #720527) | Cod sursa (job #65672) | Cod sursa (job #1068591)
#include <fstream>
#include <vector>
#define NMax 100010
#define MMax 200010
#define WHITE 0
#define RED 1
#define PURPLE 2
using namespace std;
bool ans[2*NMax];
bool existaSol;
int n, m;
vector <int> G[2*NMax], GT[2*NMax];
bool viz[2*NMax];
int p[2*NMax], np;
inline int neg(const int x)
{
if (x <= n)
return n + x;
return x - n;
}
inline void Add(const int x, const int y)
{
G[neg(x)].push_back(y);
G[neg(y)].push_back(x);
GT[y].push_back(neg(x));
GT[x].push_back(neg(y));
}
void Read()
{
ifstream f ("andrei.in");
f>>n>>m;
for (int i = 1; i<=m; ++i)
{
int x, y, color;
f>>x>>y>>color;
switch(color)
{
case WHITE:
// !x || !y daca A == 1 doar ca A == 0 si deci facem x || y
Add(x, y);
break;
case RED:
// x || y daca B == 0 doar ca B == 1 si deci facem !x || !y
Add (neg(x), neg(y));
break;
case PURPLE:
// (!x || y) && (x || !y)
Add(neg(x), y);
Add(x, neg(y));
break;
}
}
f.close();
}
inline void DFS(const int node)
{
viz[node] = true;
for (vector <int>::iterator it = G[node].begin(); it!=G[node].end(); ++it)
if (!viz[*it])
DFS(*it);
p[++np] = node;
}
inline void DFST(const int node)
{
if (ans[node] == true)
{/// chiar daca exista sol mereu la problema asta
existaSol = false;
return ;
}
ans[neg(node)] = true;
viz[node] = false;
for (vector <int>::iterator it = GT[node].begin(); it!=GT[node].end(); ++it)
if (viz[*it])
DFST(*it);
}
void Solve()
{
existaSol = true;
int n2 = n + n;
for (int i = 1; i<=n2; ++i)
if (!viz[i])
DFS(i);
for (int i = n2; i; --i)
if (viz[p[i]] && viz[neg(p[i])])
DFST(p[i]);
}
void Write()
{
ofstream g("andrei.out");
int i;
for (i=1; i<=n; ++i)
g<<ans[i]<<" ";
g<<"\n";
g.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}