牛客國慶集訓派對Day3 J Graph Coloring(dfs)
阿新 • • 發佈:2018-12-15
分開來看,第一個問題很簡單,知道染色發現衝突即可。
對於第二個問題就是一個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; }