洛谷P1330 封鎖陽光大學 二分圖判斷+dfs
阿新 • • 發佈:2018-12-05
如果這個圖不是二分圖就輸出impossible
否則對圖進行染色(圖可能不是聯通的),對每一個聯通塊染成兩種顏色(比如-1和1),然後統計-1和1的個數,用一個數組儲存他們中的較小值,最後對這個陣列求和就行了
#include<iostream> #include<vector> using namespace std; int color[10005],book[10005],sum[3]; int n,m,ans; vector<int>g[10005]; bool dfs(int x,int c)//把頂點染色成c { if(color[x]==c)returntrue; sum[c+1]++;//計數 if(color[x]==-c)return false; color[x]=c; for(int i=0;i<g[x].size();i++) { if(color[g[x][i]]==c)return false; if(color[g[x][i]]==0&&dfs(g[x][i],-c)==false)return false; } return true; } void solve() { int i; cin>>n>>m;for(i=1;i<=m;i++) { int a,b; cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } for(i=1;i<=n;i++) { if(color[i]==0){ if(dfs(i,1)==false){cout<<"Impossible\n";return;} ans+=min(sum[0],sum[2]); sum[0]=0;sum[2]=0; } } cout<<ans<<endl; } int main() { solve(); }