思路:判断一个图能否变为一个二分图,直接DFS就好了
#include<bits\stdc++.h>
using namespace std;
const int maxn = 100000+500;
vector<int>e[maxn];
vector<int>ans[2];
int vis[maxn];
int flag;
int type[maxn];
void dfs(int u,int fa,int ty)
{
ans[ty].push_back(u);
vis[u]=1;
type[u]=ty;
for(int i = 0;i<e[u].size();i++)
{
int v = e[u][i];
if(v==fa)
continue;
if(vis[v]&&type[v]==type[u])
flag=1;
if(vis[v])
continue;
dfs(v,u,1-ty);
}
}
int main()
{
int n,m;
flag = 0;
scanf("%d%d",&n,&m);
for(int i = 0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i = 1;i<=n;i++)
if(!vis[i]&&!flag)
dfs(i,-1,0);
if(flag)
{
cout << "-1" << endl;
return 0;
}
cout << ans[0].size() << endl;
for(int i = 0;i<ans[0].size()-1;i++)
cout << ans[0][i] << " ";
cout << ans[0][ans[0].size()-1] << endl;
cout << ans[1].size() << endl;
for(int i =0;i<ans[1].size()-1;i++)
cout << ans[1][i] << " ";
cout << ans[1][ans[1].size()-1] << endl;
}