最小覆盖点集模板
2017-07-16 08:56
211 查看
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=1111; int n1,n2,k; int mp ,vis ,link ; int vis2 ; int v ; int dfs(int x) { int i; vis2[x]=1; for(i=1; i<=n2; i++) { if(!mp[x][i]&&!vis[i]) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=x; return 1; } } } return 0; } int main() { int i,x,y,s; int cas = 0; while(scanf("%d%d%d",&n1,&n2,&k)&&n1){ s=0; for(int i=1;i<=n1;i++){ for(int j=1;j<=n2;j++){ mp[i][j]=1; } } for(i=0; i<k; i++) { scanf("%d%d",&x,&y); mp[x][y]=0; } memset(link,-1,sizeof(link)); for(i=1; i<=n1; i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) s++; } memset(vis,0,sizeof(vis)); memset(vis2,0,sizeof(vis2)); memset(v,0,sizeof(v)); for(int i=1;i<=n2;i++){ v[link[i]]=1; //printf("link[%d] :%d\n",i,link[i]); } for(int i=1;i<=n1;i++){ if(!v[i]) dfs(i); } printf("%d",s); //左边覆盖点 for(int i=1;i<=n1;i++){ if(!vis2[i]) printf(" r%d",i); } //右边覆盖点 for(int i=1;i<=n2;i++){ if(vis[i]) printf(" c%d",i); } puts(""); } return 0; }
相关文章推荐
- 最小覆盖点集模板
- 最小点集覆盖与最大匹配之匈牙利算法
- hdu 1504最小点集覆盖
- POJ 3041 Asteroid (二分匹配模板-二分图最小覆盖)
- hdu 1054 Strategic Game(模板) 最大二分匹配,最小点覆盖 匈牙利算法
- BZOJ 1185([HNOI2007]最小矩形覆盖-旋转卡壳+点集几何意义)
- hdu 1845 Jimmy’s Assignment 二分匹配最小点集覆盖
- ZOJ 3147 Dezider's Coverup【最小圆覆盖】【模板题】
- UVA 12549 Sentry Robots 最小点集覆盖
- 二分图最大匹配的König定理-最小点集覆盖【Matrix67】
- pku2226 最小点集覆盖,行列覆盖
- POJ1422 有向无环图求最小点覆盖[模板]
- POJ 1325 ZOJ 1364 最小覆盖点集
- POJ 2069 super star(三维点集最小圆覆盖 模拟退火)
- 旋转卡壳法求点集的最小覆盖矩形面积以及周长
- ZOJ 1450 Minimal Circle 点集的最小圆覆盖
- hdu 4160 Dolls--最小点集覆盖=V-二分图最大匹配
- POJ 1325 Machine Schedule (二分图最小点集覆盖 匈牙利算法)
- 【POJ2125】Destroying The Graph(最小权覆盖点集)
- 行列覆盖,最小点集覆盖