ZOJ1654.Place the Robots放置机器人——最大独立集
2015-03-18 13:40
232 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654
题目描述:
Robert 是一个著名的工程师。一天,他的老板给他分配了一个任务。任务的背景是:给定一
个m×n 大小的地图,地图由方格组成,在地图中有3 种方格-墙、草地和空地,他的老板希望
能在地图中放置尽可能多的机器人。每个机器人都配备了激光枪,可以同时向四个方向(上、下、
左、右)开枪。机器人一直待在最初始放置的方格处,不可移动,然后一直朝四个方向开枪。激
光枪发射出的激光可以穿透草地,但不能穿透墙壁。机器人只能放置在空地。当然,老板不希望
机器人互相攻击,也就是说,两个机器人不能放在同一行(水平或垂直),除非他们之间有一堵墙
格开。
给定一张地图,你的程序需要输出在该地图中可以放置的机器人的最大数目。
思路:
以样例解释
在问题的原型中,草地,墙这些信息不是本题所关心的,本题关心的只是空地和空地之间的联系。因此,很自然想到了下面这种简单的模型:以空地为顶点,在有冲突的空地间连边。
把所有的空地用数字标明,得到a图:
把所有有冲突的空地间用边连接后得到图(b):
于是,问题转化为求图的最大独立集问题:求最大顶点集合,集合中所有顶点互不连接(即互不冲突)。但是最大点独立集问题是一个NP 问题,没有有效的算法能求解。
————————————————————————————————————————————————————————————————————————
将每一行被墙隔开、且包含空地的连续区域称作“块”。显然,在一个块之中,最多只能放一个机器人。把这些块编上号,如图7.25(a)所示。需要说明的是,最后一行,即第4 行有两个空地,但这两个空地之间没有墙壁,只有草地,所以这两个空地应该属于同一“块”。同样,把竖直方向的块也编上号,如图7.25(b)所示。
把每个横向块看作二部图中顶点集合X 中的顶点,竖向块看作集合Y 中的顶点,若两个块有公共的空地(注意,每两个块最多有一个公共空地),则在它们之间连边。例如,横向块2 和竖向块1 有公共的空地,即(2, 0),于是在X 集合中的顶点2 和Y 集合中的顶点1 之间有一条边。这样,问题转化成一个二部图,如图7.25(c)所示。由于每条边表示一个空地(即一个横向块和一个竖向块的公共空地),有冲突的空地之间必有公共顶点。例如边(x1, y1)表示空地(0, 0)、边(x2, y1)表示空地(2, 0),在这两个空地上不能同时放置机器人。所以问题转化为在二部图中找没有公共顶点的最大边集,这就是最大匹配问题。
以上面给的样例的构造结果:
匈牙利算法 O( VE )
0MS 372KB
题目描述:
Robert 是一个著名的工程师。一天,他的老板给他分配了一个任务。任务的背景是:给定一
个m×n 大小的地图,地图由方格组成,在地图中有3 种方格-墙、草地和空地,他的老板希望
能在地图中放置尽可能多的机器人。每个机器人都配备了激光枪,可以同时向四个方向(上、下、
左、右)开枪。机器人一直待在最初始放置的方格处,不可移动,然后一直朝四个方向开枪。激
光枪发射出的激光可以穿透草地,但不能穿透墙壁。机器人只能放置在空地。当然,老板不希望
机器人互相攻击,也就是说,两个机器人不能放在同一行(水平或垂直),除非他们之间有一堵墙
格开。
给定一张地图,你的程序需要输出在该地图中可以放置的机器人的最大数目。
思路:
以样例解释
在问题的原型中,草地,墙这些信息不是本题所关心的,本题关心的只是空地和空地之间的联系。因此,很自然想到了下面这种简单的模型:以空地为顶点,在有冲突的空地间连边。
把所有的空地用数字标明,得到a图:
把所有有冲突的空地间用边连接后得到图(b):
于是,问题转化为求图的最大独立集问题:求最大顶点集合,集合中所有顶点互不连接(即互不冲突)。但是最大点独立集问题是一个NP 问题,没有有效的算法能求解。
————————————————————————————————————————————————————————————————————————
将每一行被墙隔开、且包含空地的连续区域称作“块”。显然,在一个块之中,最多只能放一个机器人。把这些块编上号,如图7.25(a)所示。需要说明的是,最后一行,即第4 行有两个空地,但这两个空地之间没有墙壁,只有草地,所以这两个空地应该属于同一“块”。同样,把竖直方向的块也编上号,如图7.25(b)所示。
把每个横向块看作二部图中顶点集合X 中的顶点,竖向块看作集合Y 中的顶点,若两个块有公共的空地(注意,每两个块最多有一个公共空地),则在它们之间连边。例如,横向块2 和竖向块1 有公共的空地,即(2, 0),于是在X 集合中的顶点2 和Y 集合中的顶点1 之间有一条边。这样,问题转化成一个二部图,如图7.25(c)所示。由于每条边表示一个空地(即一个横向块和一个竖向块的公共空地),有冲突的空地之间必有公共顶点。例如边(x1, y1)表示空地(0, 0)、边(x2, y1)表示空地(2, 0),在这两个空地上不能同时放置机器人。所以问题转化为在二部图中找没有公共顶点的最大边集,这就是最大匹配问题。
以上面给的样例的构造结果:
匈牙利算法 O( VE )
0MS 372KB
[code]#include<iostream> #include<cstdio> #include<cstring> #include<vector> const int MAXN=2550; using namespace std; int n,m; int nx,ny;//水平方向上块的个数,垂直方向上块的个数 char pic[55][55];//地图 int xs[55][55],ys[55][55];//水平方向上块的编号,垂直方向上块的编号 vector<int> g[MAXN];//g[i]表示与左边点i相连的右边的点 int from[MAXN];//from[y]表示与Yi匹配的X顶点 // cy数组 int tot;//最大匹配数 bool use[MAXN];// int flag; bool match(int x){ for(int i=0;i<g[x].size();++i){ if(!use[g[x][i]]){ use[g[x][i]]=true; if(from[g[x][i]]==-1||match(from[g[x][i]])){ from[g[x][i]]=x; return true; } } } return false; } int hungary(){ tot=0; memset(from,255,sizeof(from)); for(int i=1;i<=nx;++i){ memset(use,0,sizeof(use)); if(match(i)) ++tot; } return tot; } int main() { int T; cin>>T; for(int cas=1;cas<=T;++cas){ printf("Case :%d\n",cas); scanf("%d%d",&n,&m); for(int i=0;i<n;++i) scanf("%s",pic[i]); nx=ny=0; memset(xs,0,sizeof(xs)); memset(ys,0,sizeof(ys)); for(int i=0;i<n;++i){ flag=0; for(int j=0;j<m;++j){ if(pic[i][j]=='o'){ if(!flag) ++nx; flag=1; xs[i][j]=nx; }else if(pic[i][j]=='#') flag=0; } } for(int j=0;j<m;++j){ flag=0; for(int i=0;i<n;++i){ if(pic[i][j]=='o'){ if(!flag) ++ny; flag=1; ys[i][j]=ny; }else if(pic[i][j]=='#') flag=0; } } for(int i=1;i<=nx;++i) g[i].clear(); for(int i=0;i<n;++i){ for(int j=0;j<m;++j){ if(xs[i][j]&&ys[i][j]) g[xs[i][j]].push_back(ys[i][j]); } } printf("%d\n",hungary()); } return 0; }
相关文章推荐
- ZOJ 1654 Place the Robots(放置机器人)------最大独立集
- ZOJ 1654 Place the Robots(放置机器人)------最大独立集
- hdu4160 Dolls (二分图最大独立集)
- [ZOJ1654]放置机器人
- ZOJ 3760 - Treasure Hunting(网络流‘最小割’最大点权独立集)
- HDU 1068 Girls and Boys (二分图最大独立集)
- HDU 1068 Girls and Boys (二分图匹配---最大独立集)
- POJ 1466 Girls and Boys(二分图最大独立集)
- UVALive 3415 Guardian of Decency(二分图的最大独立集)
- 最大团,最大独立集
- hdu 2768(建图,最大点独立集)
- loj6226「网络流 24 题」骑士共存问题(二分图最大点独立集,最小割)
- poj 2771 二分图最大独立集
- 【最大点权独立集】【HDU1565】【方格取数】
- HDU 4619 (二分图匹配 最大独立集)
- hdu 1565 方格取数(2)(网络流之最大点权独立集)
- HIHO #1127 : 二分图三·二分图最小点覆盖和最大独立集
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
- 【最大点独立集】【poj1419】【Graph Coloring】
- 二分图最大独立集——POJ 2771