有一个小技巧,每次开始时先把根节点放进队列中,第一层循环循环层数,令k=q.size(),第二层循环从0到k每次pop()一个,在第二层循环完成之前,所有pop()出的点都是属于同一层。
int f(int u){
queue<int> q;
q.push(u);
int index=1;
vis[u]=index;
while(!q.empty()){
index^=3;
int k=q.size();
for(int i=0;i<k;i++) {
int x=q.front();q.pop();
for(int i=0;i<edges[x].size();i++){
if(!vis[ edges[x][i] ]) {
vis[ edges[x][i] ]=index;
q.push(edges[x][i]);
}else if(vis[edges[x][i]]==vis[x]) return -1;
}
}
}
}
----------
int main()
{
for(int i=1;i<=n;i++){
if(!vis[i]) {
int u=f(i);
if(u==-1) {
printf("Impossible");
return 0;
}
}
}
}