图中顶点看成村庄,每条边看成一段公路,如果在一段公路旁建一所学校,两个村子的学生都可以去上学,问至少要建几个学校
最小边覆盖 = n-最大匹配(这里最大匹配要除以2,因为将每个村庄一分为二,二分图左边是这n个村庄,右边也是这n个村庄)
#include<stdio.h>
#include<string.h>
int n,m,ans=0;//n个村庄,m条边
int visit[105];
int link[105];
int map[105][105];
int dfs(int i){
int j;
for(j=1;j<=n;j++){
if(map[i][j]==1 && visit[j]==0){
visit[j]=1;
if(link[j]==0 || dfs(link[j])==1){
link[j]=i;
return 1;
}
}
}
return 0;
}
int main(){
int x,y,i;
memset(link,0,sizeof(link));
memset(map,0,sizeof(map));
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
map[x][y]=1;
map[y][x]=1;
}
for(i=1;i<=n;i++){
memset(visit,0,sizeof(visit));
if(dfs(i)==1){
ans++;
}
}
printf("%d",n-ans/2);
}