最小边覆盖问题 二分图

来源:互联网 发布:托管淘宝店铺 编辑:程序博客网 时间:2024/06/06 00:31

图中顶点看成村庄,每条边看成一段公路,如果在一段公路旁建一所学校,两个村子的学生都可以去上学,问至少要建几个学校

最小边覆盖 = 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);}


阅读全文
0 0
原创粉丝点击