Pagini recente » Cod sursa (job #2203023) | Cod sursa (job #1003228) | Cod sursa (job #1106017) | Cod sursa (job #2540796) | Cod sursa (job #467559)
Cod sursa(job #467559)
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
#define maxn 200010
int n, m, i, j, k, an, nc, nctc, a[maxn], b[maxn];
int st[maxn], st2[maxn], cc[maxn/2], ctc[maxn];
char clt[maxn], clc[maxn/2], f[maxn], c[maxn];
vector<long> dir[maxn], inv[maxn];
void df(long comp, long nod)
{
if(f[nod])
return;
f[nod]=1;
cc[nod]=comp;
for(long y=0; y<dir[nod].size(); y++)
df(comp, dir[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<dir[nod].size(); y++)
df3(comp, dir[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[i], &b[i], &c[i]);
if(c[i]==2)
{
dir[a[i]].push_back(b[i]);
dir[b[i]].push_back(a[i]);
}
}
for(i=1; i<=n; i++)
if(f[i]==0)
{
nc++;
df(nc, i);
}
for(i=1; i<=n; i++)
dir[i].clear();
for(i=1; i<=m; i++)
{
if(c[i]==0)
{
dir[cc[a[i]]].push_back(cc[b[i]]+nc);
dir[cc[b[i]]].push_back(cc[a[i]]+nc);
}
if(c[i]==1)
{
dir[cc[a[i]]+nc].push_back(cc[b[i]]);
dir[cc[b[i]]+nc].push_back(cc[a[i]]);
}
}
memset(f, 0, sizeof(f));
for(i=1; i<=2*nc; i++)
if(!f[i])
df2(i);
for(i=1; i<=2*nc; i++)
dir[i].clear();
for(i=1; i<=m; i++)
{
if(c[i]==0)
{
dir[cc[a[i]]+nc].push_back(cc[b[i]]);
dir[cc[b[i]]+nc].push_back(cc[a[i]]);
}
if(c[i]==1)
{
dir[cc[a[i]]].push_back(cc[b[i]]+nc);
dir[cc[b[i]]].push_back(cc[a[i]]+nc);
}
}
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;
an=st2[i]+nc;
if(an>2*nc)
an-=2*nc;
if(clt[ctc[an]]==2)
clt[ctc[an]]=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;
}