Pagini recente » Cod sursa (job #1919690) | Cod sursa (job #1062065) | Cod sursa (job #82157) | Cod sursa (job #2828644) | Cod sursa (job #1299562)
#include <cstdio>
#include <vector>
#define nmax 100005
#define pb push_back
#define mp make_pair
using namespace std;
vector<pair<int, int> >a[nmax];
bool used[nmax];
int n, m, x, y, z, i;
short sol[nmax];
vector<int> visited;
inline bool df(int node, int qq)
{
vector<pair<int, int> >::iterator it;
if(used[node])
{
if(sol[node]!=qq) return 0;
return 1;
}
visited.pb(node);
used[node]=true;
sol[node]=qq;
for(it=a[node].begin(); it!=a[node].end(); ++it)
{
if(it->second==0 && qq==0) //cazul I, in care node si vecinul sau nu pot sa fie in A
{
if(!df(it->first, 1)) return 0;
//returneaza 0 daca node si vecinul sau nu pot fi asezati astfel in A si B
}
if(it->second==1 && qq==1) //cazul II, in care node si vecinul sau nu pot sa fie in B
{
if(!df(it->first, 0)) return 0;
//returneaza 0 daca node si vecinul sau nu pot fi asezati astfel in A si B
}
if(it->second==2) //daca muchia e violet node si vecinul sau se afla in aceeasi multime qq
{
if(!df(it->first, qq)) return 0;
//returneaza 0 daca node si vecinul sau nu pot fi asezati astfel in A si B
}
}
return 1; //daca toate conditiile sunt indeplinite returneaza 1
}
int main ()
{
freopen("andrei.in", "rt", stdin);
freopen("andrei.out", "wt", stdout);
scanf("%d%d", &n, &m);
for(i=1; i<=m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
a[x].pb(mp(y, z));
a[y].pb(mp(x, z));
}
vector<int>::iterator it;
for(i=1; i<=n; ++i)
if(!used[i])
{
if(!df(i, 0)) //verific in ce multime se potriveste fiecare nod si actualizez si pozitia vecinilor in multimi
{
for(it=visited.begin(); it!=visited.end(); ++it) used[*it]=false;
df(i, 1);
}
}
for(i=1; i<=n; ++i)
printf("%d ", sol[i]);
return 0;
}