#include<iostream>
#include<queue>
#include<vector>
using namespace std;
typedef struct Gnode
{
int color;//0 white,1 gray,2 black;
int index;
int depth;
bool visited;
struct Gnode *next;
}Gnode;
int N,M;//无向图,N为顶点,M为边
bool judge(Gnode G[],int s)
{
int i;
int count=0;
queue<int> q;
q.push(s);
G[s].visited=true;
G[s].color=1;
while(!q.empty())
{
int t=q.front();
q.pop();
count++;
Gnode *temp=G[t].next;
while(temp!=NULL)
{
int t2=temp->index;
if(!G[t2].visited)
{
G[t2].color=1;
q.push(t2);
G[t2].visited=true;
G[t2].depth=G[t].depth+1;
}
else
{
if((G[t2].depth+G[t].depth)%2==0)
return false;
}
temp=temp->next;
}
G[s].color=2;
if(q.empty()&&count!=N)
{
for(i=0;i<N;i++)
{
if(!G[i].visited)
{
q.push(i);
G[i].visited=true;
break;
}
}
}
}
}
void PutOut(Gnode G[],int s,vector<int> &vw,vector<int> &vb)
{
queue<int> q;
vw.push_back(s);
int count=0;
G[s].visited=true;
q.push(s);
bool flag=true;
while(!q.empty())
{
queue<int> q1;
while(!q.empty())
{
int t=q.front();
q.pop();
count++;
Gnode *temp=G[t].next;
while(temp!=NULL)
{
int index=temp->index;
if(G[index].visited)
{
temp=temp->next;
continue;
}
else
{
G[index].visited=true;
q1.push(index);
if(flag)
vb.push_back(index);
else
vw.push_back(index);
temp=temp->next;
}
}
}
q=q1;
if(q.empty()&&count!=N)
{
for(int i=0;i<N;i++)
{
if(!G[i].visited)
{
q.push(i);
G[i].visited=true;
if(flag)
vb.push_back(i);
else
vw.push_back(i);
break;
}
}
}
if(flag)
flag=false;
else
flag=true;
}
int i;
for(i=0;i<vw.size();i++)
{
printf("%d ",vw[i]);
}
printf("\n");
for(i=0;i<vb.size();i++)
{
printf("%d ",vb[i]);
}
printf("\n");
}
int main()
{
vector<int> vw;
vector<int> vb;
scanf("%d %d",&N,&M);
int i,j;
Gnode *G=new Gnode[N];
for(i=0;i<N;i++)
{
G[i].index=i;
G[i].color=0;
G[i].next=NULL;
G[i].visited=false;
}
for(i=0;i<M;i++)
{
int a,b;
scanf("%d %d",&a,&b);
Gnode *temp1=new Gnode;
temp1->index=b;
temp1->next=NULL;
Gnode *temp=&G[a];
while(temp->next!=NULL)
temp=temp->next;
temp->next=temp1;
Gnode *temp2=new Gnode;
temp2->index=a;
temp2->next=NULL;
temp=&G[b];
while(temp->next!=NULL)
temp=temp->next;
temp->next=temp2;
}
G[0].depth=0;
if(judge(G,0))
{
printf("Yes\n");
for(i=0;i<N;i++)
{
G[i].color=0;
G[i].visited=false;
}
PutOut(G,0,vw,vb);
}
else
{
printf("NO\n");
}
return 0;
}
测试数据
第一组
10 <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">0</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">第二组</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">6 5
0 1
0 3
2 3
3 4
4 5
</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">第三组</span>
6 3
0 1
2 3
4 5