Pagini recente » Cod sursa (job #544361) | Cod sursa (job #427415) | Cod sursa (job #916659) | Cod sursa (job #3225062) | Cod sursa (job #467299)
Cod sursa(job #467299)
#include<cstdio>
#include<vector>
#define infile "andrei.in"
#define outfile "andrei.out"
#define nmax 100013
#define mmax 200013
using namespace std;
vector <int> nod[nmax][3]; //vecinii cu fiecare culoare al fiecarui nod
vector <int> com[nmax][2]; //inlocuim nodurile cu componente conexe
int comp[nmax]; //comp[i]=din a cata componenta conexa face parte nodul i, avand doar muchii violet (2)
char group[nmax]; //grupa din care face parte fiecare componenta conexa (A sau B)
char viz[nmax]; //vector de vizite :))
int n; //numarul de noduri
int m; //numarul de muchii
int nrc; //numarul de componente conexe
int count; //trebuie sa stim cate componente conexe avem rezolvate
void read()
{
int i,a,b,c;
scanf("%d %d\n",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d %d %d\n",&a,&b,&c);
nod[a][c].push_back(b);
nod[b][c].push_back(a);
}
}
void dfs(int x)
{
comp[x]=nrc;
vector <int>::iterator it;
for(it=nod[x][2].begin();it!=nod[x][2].end();++it)
if(!comp[*it])
dfs(*it);
}
void dfs_com(int x)
{
viz[x]=1;
vector <int>::iterator it;
int i;
if(group[x]=='A') i=0;
else i=1;
for(it=com[x][i].begin();it!=com[x][i].end();++it)
if(!viz[*it])
{
if(!group[*it])
{
++count;
if(i==0) group[*it]='B';
else group[*it]='A';
}
dfs_com(*it);
}
}
void init()
{
int i;
//facem componentele conexe
for(i=1;i<=n;++i)
if(!comp[i])
++nrc,dfs(i);
}
void solve()
{
vector <int>::iterator it;
int i,j;
//stabilim componentele conexe ce trebuie neaparat sa fie neaparat in una din grupe
//si construi noul graf ce inlocuieste nodurile cu componente conexe
for(j=0;j<2;++j)
for(i=1;i<=n;++i)
for(it=nod[i][j].begin();it!=nod[i][j].end();++it)
if(comp[i]==comp[*it])
{
++count;
if(j==1) group[comp[i]]='A';
else group[comp[i]]='B';
}
else
{
com[comp[i]][j].push_back(comp[*it]);
com[comp[*it]][j].push_back(comp[i]);
}
//rezolvam noile "interdictii"
//cu putin bulan 8-> :x
while(count<nrc)
{
for(i=1;i<=nrc;++i)
if(!viz[i] && group[i])
dfs_com(i);
if(count<nrc)
for(i=1;i<=nrc;++i)
if(!group[i])
{
group[i]='A'; //As
++count;
break;
}
}
}
void write()
{
int i;
for(i=1;i<=n;++i)
if(group[comp[i]]=='A')
printf("0 ");
else printf("1 ");
printf("\n");
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
init();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}