1. 程式人生 > >洛谷P1330 封鎖陽光大學 二分圖判斷+dfs

洛谷P1330 封鎖陽光大學 二分圖判斷+dfs

傳送門

如果這個圖不是二分圖就輸出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)return
true; 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(); }