Pagini recente » Cod sursa (job #2942443) | Cod sursa (job #234472) | Cod sursa (job #2002131) | Cod sursa (job #136319) | Cod sursa (job #467553)
Cod sursa(job #467553)
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
#define maxn 200010
int n, m, i, j, k, nc, nctc, a, b, c;
int st[maxn], st2[maxn], cc[maxn], ctc[maxn];
char clt[maxn], clc[maxn], f[maxn];
vector<long> v[3][maxn/2], dir[maxn], inv[maxn];
void df(long comp, long tip, long nod)
{
if(f[nod])
return;
f[nod]=1;
cc[nod]=comp;
for(long y=0; y<v[tip][nod].size(); y++)
df(comp, tip, v[tip][nod][y]);
}
void df2(long nod)
{
if(f[nod])
return;
f[nod]=1;
for(long y=0; y<dir[nod].size(); y++)
df2(dir[nod][y]);
st[++st[0]]=nod;
}
void df3(long comp, long nod)
{
if(f[nod])
return;
f[nod]=1;
ctc[nod]=comp;
for(long y=0; y<inv[nod].size(); y++)
df3(comp, inv[nod][y]);
st2[++st2[0]]=nod;
}
int main()
{
freopen("andrei.in", "r", stdin);
freopen("andrei.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i=1; i<=m; i++)
{
scanf("%d%d%d", &a, &b, &c);
v[c][a].push_back(b);
v[c][b].push_back(a);
}
for(i=1; i<=n; i++)
if(f[i]==0)
{
nc++;
df(nc, 2, i);
}
for(i=1; i<=n; i++)
{
for(j=0; j<v[0][i].size(); j++)
{
dir[cc[i]].push_back(cc[v[0][i][j]]+nc);
dir[cc[v[0][i][j]]].push_back(cc[i]+nc);
inv[cc[v[0][i][j]]+nc].push_back(cc[i]);
inv[cc[i]+nc].push_back(cc[v[0][i][j]]);
}
for(j=0; j<v[1][i].size(); j++)
{
inv[cc[i]].push_back(cc[v[1][i][j]]+nc);
inv[cc[v[1][i][j]]].push_back(cc[i]+nc);
dir[cc[v[1][i][j]]+nc].push_back(cc[i]);
dir[cc[i]+nc].push_back(cc[v[1][i][j]]);
}
}
memset(f, 0, sizeof(f));
for(i=1; i<=2*nc; i++)
if(!f[i])
df2(i);
memset(f, 0, sizeof(f));
for(i=2*nc; i; i--)
{
clt[i]=2;
if(!f[st[i]])
{
nctc++;
df3(nctc, st[i]);
}
}
for(i=1; i<=2*nc; i++)
{
if(clt[ctc[st2[i]]]==2)
clt[ctc[st2[i]]]=1;
a=st2[i]+nc;
if(a>2*nc)
a-=2*nc;
if(clt[ctc[a]]==2)
clt[ctc[a]]=1-clt[ctc[st2[i]]];
}
for(i=1; i<=nc; i++)
clc[i]=clt[ctc[i]];
for(i=1; i<=n; i++)
printf("%d ", clc[cc[i]]);
printf("\n");
return 0;
}