hdu 3360 National Treasures 二分匹配
来源:互联网 发布:黄金直播软件 编辑:程序博客网 时间:2024/06/05 04:02
题意:给出一个R*C的表,每个格子上标有值,-1表示已经有的保安,其他表示古董的价值,要看守一个古董就必须在1~12各个点上都有保安,求最少要雇的保安。
思路:建图,从图中可以发现古董和保安的位置相差一个奇数,所以我们可以将表格着色,白的为x部,黑的为Y部,古董和保安连一条边,求最小点覆盖。
代码:
#include<stdio.h>#include<string.h>#include<algorithm>#define maxn 52#define clr(a,b) memset(a,b,sizeof(a))using namespace std;int px[]={-1,-2,-2,-1,1,2,2,1,-1,0,1,0};int py[]={-2,-1,1,2,2,1,-1,-2,0,1,0,-1};int map[maxn][maxn],vis[10000];int mat[maxn*maxn],nx,ny,r,c,id[maxn][maxn];int first[1000],ev[20001],next[20001],e;bool find(int u){ int v; for(int i=first[u];i!=-1;i=next[i]) { v=ev[i]; if(!vis[v]) { vis[v]=1; if(mat[v]==-1||find(mat[v])) { mat[v]=u; return 1; } } } return 0;}int Hungary(int nx){ clr(mat,-1); int Max=0; for(int i=1;i<=nx;i++) { clr(vis,0); if(find(i)) Max++; } return Max;}void add(int u,int v){ next[e]=first[u],ev[e]=v,first[u]=e++;}void makemap(){ int x,k,u,v; clr(first,-1); e=1; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { if(map[i][j]==-1) continue; x=map[i][j]; k=0; while(x) { if(x%2==1) { u=i+px[k]; v=j+py[k]; if(1<=u&&u<=r&&v>=1&&v<=c&&map[u][v]!=-1) { if((i+j)%2==0) add(id[i][j],id[u][v]); else add(id[u][v],id[i][j]); } } k++; x/=2; } }}int main(){ //freopen("D:/d.txt","r",stdin); int cas=1,ans; while(~scanf("%d %d",&r,&c)) { if(r==c&&r==0) break; clr(id,0); nx=0; ny=0; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { scanf("%d",&map[i][j]); if(map[i][j]==-1) continue; else if((i+j)%2==0) id[i][j]=++nx; else id[i][j]=++ny; } makemap(); ans=Hungary(nx); printf("%d. %d\n",cas++,ans); } return 0;}
- hdu 3360 National Treasures 二分匹配
- hdu 3360 National Treasures 二分行列匹配
- hdu 3360 National Treasures(二分图匹配--最小点覆盖)
- hdu 3360National Treasures
- HDU 3360National Treasures(行列匹配+最大匹配)
- hdu 3360 National Treasures 最小顶点覆盖(最大匹配)
- HDU 3360-National Treasures(最小点覆盖+奇偶匹配)
- HDU 3360 National Treasures 奇偶匹配最小点覆盖
- HDU 3360 National Treasures(KM,4级)
- HDOJ 3360 - National Treasures 二分图的最小点覆盖
- hdu 3360 National Treasures(最小顶点覆盖,黑白染色)
- HDU 3360 National Treasures 黑白染色+最小点覆盖 ACM Steps 6.3.8
- National Treasures 6.3.8
- hdu_3360 National Treasures 最小点覆盖
- hdu 1150 二分匹配
- hdu 1281 二分匹配
- hdu 3081 二分匹配
- HDU 1045 二分匹配
- 如何更改访问局域网共享用户名和密码
- android ListView几个比较特别的属性
- PS00 火焰字
- c/c++ 字符数组、字符指针和字符串类型总结帖
- ATL 的CComCoClass .
- hdu 3360 National Treasures 二分匹配
- FlexPaper+SwfTools实现的在线文档功能
- Android应用开发之(WindowManager类使用)
- qt字体设置问题
- Starling flash 简单应用
- c++ 模板
- Android WindowManager与窗口管理(转)
- Struts2_学习笔记(六)----result type、global result(extends)、dynamic result、带参数的result、result总结
- Source Insight 中自定义命令的实现