牛客 Wannafly 挑戰賽專題
阿新 • • 發佈:2018-12-18
Wannfly 27
這是一個找規律+dfs的題,由於每條邊最多被包含於一個環,所以不可能出現這種圖:
這樣的話,規律很容易找到:當邊數為偶數時,最少顏色數是2,邊數為奇數,最少顏色數為3。接下來就使用dfs搜尋判斷這是不是一個二分圖,(因為二分圖的判定過程就是:能否用黑白兩色染色成功)。若是二分圖,輸出2;否則輸出3。
#include<iostream> #include<vector> #include<string.h> using namespace std; typedef long long ll; const int maxn=200000+10; int n,m; vector<int>vec[maxn]; int color[maxn]; bool vis[maxn]; int flag=0; void dfs(int u,int c) { color[u]=c; vis[u]=true; for(int i=0;i<vec[u].size();i++){ int v=vec[u][i]; if(!vis[v]){ vis[v]=true; dfs(v,-c); } else if(color[v]==color[u]){ flag=1; return; } } } int main() { cin>>n>>m; int u,v; for(int i=1;i<=m;i++){ cin>>u>>v; vec[u].push_back(v); vec[v].push_back(u); } memset(vis,0,sizeof(vis)); dfs(1,1); if(flag) cout<<3<<endl; else cout<<2<<endl; return 0; }