按读入建图,dfs的时候,如果相邻的点已经有颜色并且和当前点的颜色相同,那么一定无解,否则染上不同与当前点的颜色继续dfs就行,注意考虑多个联通量的问题...
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;
bool g[220][220];
int col[220];
int n,m,p,q,k;
bool flag;
void dfs(int u,int t)
{
for (int i=1; i<=n; i++)
if (g[u][i] && i!=u)
{
if (col[i]==-1)
{
col[i]=t^1;
dfs(i,t^1);
}
else if (col[i]==t)
{
flag=false;
return;
}
if (!flag) return;
}
}
int main()
{
// freopen("in.txt","r",stdin);
memset(g,false,sizeof g);
scanf("%d%d",&n,&m);
int x,y;
for (int i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
g[x][y]=g[y][x]=true;
}
memset(col,-1,sizeof col);
flag=true;
for (int i=1; i<=n; i++)
if (col[i]==-1)
{
col[i]=0;
dfs(i,0);
}
if (flag)
{
puts("yes");
int ans=0;
for (int i=1; i<=n; i++)
if (!col[i]) ans++;
printf("%d\n",ans);
for (int i=1; i<=n; i++)
if (!col[i])
printf("%d ",i);
puts("");
}
else puts("no");
return 0;
}