- 二分匹配即就是找出最大匹配数,注意,要使用二分匹配必须能使数据分成两份不同的点集,然后一边与另一边匹配,其重点在于找增广路径,干说有点不好讲,直接上代码,下面是一个邻接表的代码:
- 注意下面代码风格:
- dis【i】,记录第i个点与谁匹配
- vis【i】,记录第i个点是否已经匹配
- match【i】【j】,i点与j点已经连接
- 主函数代码:
找增广路径代码:<span style="font-size:18px;"> for(i=0;i<n;i++) { scanf("%d",&m); while(m--) { scanf("%d",&p); match[ki.push_back(p);//存储邻接表 } } memset(dis,-1,sizeof(dis));//这里初始化为-1 int ans=0; for(i=0;i<n;i++)//遍历邻接表 { memset(vis,0,sizeof(vis));//注意,这里每次都必须初始化,不然就没法找增广路径 if(dfs(i)==1) ans++; }</span>
这里分享一个比较好理解的二分匹配资源:http://blog.csdn.net/dark_scope/article/details/8880547<span style="font-size:18px;">int dfs(int x)//找匹配点 { for(int j=0;j<match[x].size();j++)//遍历x点的邻接点 { int val=match[x][j];//取出值 if(vis[val]==0) { vis[val]=1; if(dis[val]==-1||dfs(dis[val]))//点val还未匹配,则直接匹配,或者找dis【val】的增广路径,找到了就替换 { dis[val]=x; return 1; } } } return 0; }</span>
图论之二分匹配
最新推荐文章于 2022-04-03 14:41:53 发布