圖的染色【洛谷P1330】
阿新 • • 發佈:2018-12-20
這是個圖的染色問題。題目看起來很複雜,但是仔細分析可以發現,將相鄰結點染成不同的顏色,這樣就保證了相鄰的點不同時選擇。然後判斷一下染色後的每一塊,將較少的顏色的個數加起來就是答案。
重點是關注圖怎麼染色,怎麼將相鄰的點染成不同的顏色。
PS:本題還有並查集的做法,效率很高。我看懂了之後會更新一下並查集的做法。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5+7; vector<int> G[maxn]; int sum[2]; int col[maxn]; int vis[maxn]; bool dfs(int now,int color) { if(vis[now]) { if(col[now]==color) return true; return false; } vis[now] = 1; sum[col[now]=color]++; bool found = true; for(int i=0;i<G[now].size();i++) { found = found && dfs(G[now][i],1-color); } return found; } int main() { int n,m; cin>>n>>m; int ans = 0; for(int i=0;i<m;i++) { int x,y; cin>>x>>y; G[x].push_back(y); G[y].push_back(x); } for(int i=1;i<=n;i++) { if(vis[i]) continue; sum[0] = sum[1] = 0; if(!dfs(i,0)) { cout<<"Impossible"<<endl; return 0; } ans += min(sum[0],sum[1]); } cout<<ans<<endl; return 0; }