wannafly_day3_J
看一个图是否时二分图,是的话输出染色方案,不是的话输出任意一个奇环。
找到奇环直接回溯即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; const int M = 3e5+7; int n,m; int flg,cnt,head[M]; int col[M],flag[M]; vector<int> vec; struct edge { int v,next; }e[M<<4]; void init(){ cnt=0;memset(head,-1,sizeof(head)); } void add(int u,int v){ e[++cnt].v=v;e[cnt].next=head[u]; head[u]=cnt; } void dfs(int u,int c){ col[u]=c; flag[u]=1; for(int i=head[u];~i;i=e[i].next){ int v=e[i].v; if(flag[v]&&col[v]!=-c){ flg=v; vec.push_back(u); return ; } if(!flag[v]) dfs(v,-c); if(flg>0){ vec.push_back(u); if(u==flg) flg=-1; return ; } if(flg==-1) return ; } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v);add(v,u); } dfs(1,1); if(flg==-1){ printf("%d\n",vec.size()); for(int i=0;i<vec.size();i++) printf("%d%c",vec[i],i==vec.size()-1?'\n':' '); } else{ printf("0\n"); for(int i=1;i<=n;i++){ if(col[i]==1) printf("%d%c",col[i],i==n?'\n':' '); else printf("0%c",i==n?'\n':' '); } } return 0; }