版权声明:哈哈哈哈哈哈哈哈哈哈哈哦吼~~ https://blog.csdn.net/threeh20/article/details/83032498
https://www.nowcoder.com/acm/contest/203/J
分开来看,第一个问题很简单,知道染色发现冲突即可。
对于第二个问题就是一个dfs找奇数环即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
vector<int>e[maxn];
int col[maxn],path[maxn];
int n,m;
void init()
{
memset(col,-1,sizeof(col));
memset(path,0,sizeof(path));
for(int i=0;i<=n;i++)
e[i].clear();
}
int flag;
int root;
void dfs(int u,int c)
{
if(!flag)return;
col[u]=c;
for(int i=0;i<e[u].size();i++)
{
if(!flag)return;
int v=e[u][i];
if(col[v]==-1)
{
path[v]=u;
dfs(v,c^1);
}
else
{
if(col[v]==c)
{
path[v]=u;
root=v;
flag=0;
return ;
}
}
}
}
int ans[maxn];
int main()
{
while(~scanf("%d%d",&n,&m))
{
int u,v;
init();
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
flag=1;
dfs(1,0);
if(flag)
{
printf("0\n");
for(int i=1;i<=n;i++)
{
if(i!=1)
printf(" ");
printf("%d",col[i]);
}
printf("\n");
}
else
{
int k=0;
ans[k++]=root;
int now=path[root];
while(now!=root)
{
ans[k++]=now;
now=path[now];
}
printf("%d\n",k);
for(int i=0;i<k;i++)
{
if(i)printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
}
return 0;
}