洛谷 P1330 封锁阳光大学
用二分图的构造方式即可,找到两种颜色最小值加起来,注意:图不连通。
#include <bits/stdc++.h>
using namespace std;
int n,m;
int color[10005];
int vis[10005];
int p=0;
int x,y;
vector<int> v[10005];
void dfs(int k,int fa){
vis[k]=1;
if(color[fa]==1){
color[k]=0;
y++;
}
else if(color[fa]==0){
color[k]=1;
x++;
}
for(int i=0;i<v[k].size();i++){
int yy= v[k][i];
if(color[yy]==color[k]){
p=1;
return ;
}
else{
if(vis[yy]==0){
dfs(yy,k);
}
}
}
return;
}
int main(){
ios::sync_with_stdio(false);
memset(color,-1,sizeof color);
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,vv;
cin>>u>>vv;
v[u].push_back(vv);
v[vv].push_back(u);
}
int ans=0;
color[0]=1;
for(int i=1;i<=n;i++){
if(vis[i]==0&&v[i].size()>=1){
x=0;
y=0;
dfs(i,0);
ans+=min(x,y);
}
}
if(p==0){
cout<<ans;
}
else{
cout<<"Impossible";
}
return 0;
}