题目:封锁阳光大学
思路:必须满足一条边连接的两点有且只有一点被选择,所以用二分图判定。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10000
#define maxm 100000
#define read(x) scanf("%d",&x)
int n,m;
vector<int> a[maxn+5];
int cnt;
int col[maxn+5];
int dfs(int x,int y) {
// cout<<" ---- "<<x<<' '<<y<<' '<<col[x]<<endl;
if(-1!=col[x]) {
if(col[x]==y) return 0;
else return -1;
}
cnt++;
int s=(1==y);
col[x]=y;
for(int i=0;i<a[x].size();i++) {
int z=dfs(a[x][i],y^1);
if(-1==z) return -1;
s+=z;
}
return s;
}
int main() {
read(n),read(m);
for(int i=1;i<=m;i++) {
int x,y;
read(x),read(y);
a[x].push_back(y);
a[y].push_back(x);
}
int ans=0;
memset(col,-1,sizeof(col));
for(int i=1;i<=n;i++) {
if(-1==col[i]) {
cnt=0;
int s=dfs(i,0);
// cout<<" "<<i<<' '<<s<<endl;
if(-1==s) goto End;
ans+=min(s,cnt-s);
}
}
printf("%d",ans);
return 0;
End:printf("Impossible");
return 0;
}