博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
阅读量:4322 次
发布时间:2019-06-06

本文共 2314 字,大约阅读时间需要 7 分钟。

题意

  N*M矩阵,有空地('o')、草地('*')、墙('#‘),机器人能攻击到上下左右,不被墙挡住的方位。

并且机器人只能被放置在空地上。问能放置的最大数量机器人,相互间不能攻击到。

 

解题思路

  对于所有空地,能够攻击到的相互之间冲突,即可连接成边,然后题目就转换成了 最大独立集问题。

但是本题 顶点数量为 50*50 = 2500, 果断TLE。

  另外我们可以发现,通过

    将每一行相互攻击到的空格位置看成一个点,这些点命名为 {A}

    将每一列相互攻击到的空格位置看成一个点,这些点命名为 {B}

  则图就转换了二分图, 对于 顶点集 {A} 与 {B} 而言, 之间存在共用的空格,则其相互间存在冲突,则当前点只能放一个机器人。

则通过将其连边, 那么问题就转换成了求 没有公共顶点的最大边集(最大匹配)。

#include
#include
#include
const int N = 51;char mp[N][N];int n, m;int row,col,r[N][N],c[N][N];bool g[N*N][N*N];int ma[N*N], mb[N*N];bool vis[N*N];void init(){ memset(r,0,sizeof(r)); memset(c,0,sizeof(c)); memset(g,0,sizeof(g)); row = col = -1; bool flag = false; for(int i = 0; i < n; i++){ flag = false; for(int j = 0; j < m; j++){ if( mp[i][j] == 'o' ){ if(!flag) ++row; r[i][j] = row, flag = true; } else if( mp[i][j] == '#' ) flag = false; } } for(int j = 0; j < m; j++){ flag = false; for(int i = 0; i < n; i++){ if( mp[i][j] == 'o' ){ if( !flag ) ++col; c[i][j] = col, flag = true; } else if( mp[i][j] == '#' ) flag = false; } } col++; row++; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) if( mp[i][j] == 'o' ) g[ r[i][j] ][ c[i][j] ] = 1;}int path( int u ){ for(int v = 0; v < col; v++){ if( g[u][v] && !vis[v] ){ vis[v] = 1; if( ma[v] == -1 || path( ma[v] ) ){ ma[v] = u; mb[u] = v; return 1; } } } return 0;}void MaxMatch(){ memset( ma,0xff,sizeof(ma)); memset( mb,0xff,sizeof(mb)); int res = 0; for(int i = 0; i < row; i++){ if( mb[i] == -1 ){ memset( vis, 0, col*sizeof(int)); res += path( i ); } } printf("%d\n", res );}int main(){ int T; scanf("%d", &T); for(int Case = 1; Case <= T; Case++){ scanf("%d%d", &n,&m); for(int i = 0; i < n; i++) scanf("%s",mp[i]); printf("Case :%d\n", Case); init(); MaxMatch(); } return 0;}

 

转载于:https://www.cnblogs.com/yefeng1627/archive/2013/04/01/2994264.html

你可能感兴趣的文章
linux中~和/的区别
查看>>
在vue-cli项目中使用bootstrap的方法示例
查看>>
jmeter的元件作用域与执行顺序
查看>>
echarts学习笔记 01
查看>>
PrimeNG安装使用
查看>>
iOS 打包
查看>>
.NET Core中的数据保护组件
查看>>
华为云软件开发云:容器DevOps,原来如此简单!
查看>>
MyEclipse 快捷键(转载)
查看>>
03链栈_LinkStack--(栈与队列)
查看>>
会滚段
查看>>
MANIFEST.MF的用途(转载)
查看>>
react高阶组件
查看>>
Android 高手进阶,自己定义圆形进度条
查看>>
Objective-C路成魔【2-Objective-C 规划】
查看>>
Java之旅(三)--- JSTL和EL表情
查看>>
正则匹配
查看>>
单利模式
查看>>
病毒表-相信对大家都有帮助-病毒词典
查看>>
ios 8 联系人ABPeoplePickerNavigationController
查看>>