二分图最大匹配 输出字典序最小的方案 poj 3715
来源:互联网 发布:centos gcc 编辑:程序博客网 时间:2024/06/06 19:21
http://poj.org/problem?id=3715
暴力也可以水过:先求最大匹配,然后从小到大枚举点去掉,重新求最大匹配,如果最大匹配数减少了,则这个点可以去掉。
比较好的做法应该是充分利用二分匹配匈牙利算法的性质,如果去掉一个点之后从这个点匹配的那个点出发找不到增广路,就可以将这个点删除,这样子做就不用每次都求全局最大匹配了,赞一个。。
#include<cstdio>#include<cstring>const int M = 210;bool g[M][M] , vis[M] , deleted[M] , grp[M];int px[M] , py[M] ;int n;bool canx(int x){if(deleted[x]) return false;for(int i = 0; i < n; i++){if(!g[x][i] || vis[i] || deleted[i] || !grp[i]) continue;vis[i] = true;if(py[i]==-1 || canx(py[i])){px[x] = i; py[i] = x;return true;}}return false;}bool cany(int y){if(deleted[y]) return false;for(int i = 0; i < n; i++){if(!g[y][i] || vis[i] || deleted[i] || grp[i]) continue;vis[i] = true;if(px[i]==-1 || cany(px[i])){px[i] = y;py[y] = i;return true;}}return false;}int main(){int t,m,i,j,k;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(g,false,sizeof(g));memset(deleted,false,sizeof(deleted));memset(px,-1,sizeof(px));memset(py,-1,sizeof(py));for(i = 0; i < n; i++) scanf("%d",&grp[i]);for(i = 0; i < m; i++){scanf("%d%d",&j,&k);if(grp[j] != grp[k]){g[j][k] = g[k][j] = true;}}int ans = 0;for(i = 0; i < n; i++) if(grp[i]==0){memset(vis,false,sizeof(vis));ans += canx(i);}printf("%d",ans);int x,y;for(i = 0; i < n && ans; i++){if(!grp[i]){if(px[i] == -1 ) continue;y = px[i];deleted[i] = true;px[i] = -1;py[y] = -1;memset(vis,false,sizeof(vis));if(cany(y)){deleted[i] = false;}else printf(" %d",i);}else {if(py[i] == -1) continue;x = py[i];deleted[i] = true;py[i] = -1;px[x] = -1;memset(vis,false,sizeof(vis));if(canx(x)){deleted[i] = false;}else printf(" %d",i);}}puts("");}return 0;}
- 二分图最大匹配 输出字典序最小的方案 poj 3715
- poj 3715 Blue and Red(二分图最大匹配+字典序输出)
- hdu 3729 I'm Telling the Truth(二分图最大匹配,字典序最大输出)
- 输出字典序最小的背包方案
- Asteroids(POJ--3041 【二分图的最小顶点集 = 二分图的最大匹配】
- 最小路径覆盖-二分图最大匹配 poj 1422
- POJ 3692 最小点覆盖 最大二分图匹配
- poj 3041 二分图最大匹配(最小点覆盖问题)
- poj 3020 二分图 最大匹配(最小边覆盖问题)
- poj 3041 二分图最大匹配 最小点覆盖
- poj 2594 二分图最大匹配最小路径覆盖
- POJ 3401 Asteroids 二分图最大匹配 最小点覆盖
- POJ 3041 Asteroids(二分图最大匹配-最小点覆盖)
- POJ 1815 给定源汇的无向图点连通度 输出字典序最小的方案
- hdu 3729(二分图最大匹配+最大字典序)
- POJ 3020二分图的最大匹配
- poj 3041 Asteroids 二分图的最大匹配==最小覆盖点。
- poj 3041(最小点覆盖及二分图的最大匹配)
- ANT build.xml文件详解
- android cmd aapt
- 计算广告学习笔记1.9 广告的基础知识-在线广告系统结构
- dede5.7二次开发添加栏目缩略图
- Linux 制作分区和增大LVM
- 二分图最大匹配 输出字典序最小的方案 poj 3715
- C++ 调用C#发邮件
- 三层架构&MVC
- 为什么项目经理拿的钱比程序员多?
- XCode常用快捷键
- android 认识
- 数据分析师都干啥?
- 关于控制系统设计的小感悟-单片机抗干扰
- Android 中Odex文件生成与合并