博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-3041 Asteroids 二分图匹配
阅读量:7155 次
发布时间:2019-06-29

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

该题题义为给定网格的中的点的坐标,现在要去将这些点摧毁,有一种武器能够一次摧毁一行或者是一列的所有目标,问最少用多少次该武器能够使得所有的目标消失。

这题怎么转化为二分图去做呢,过程是这样的,首先对于每个目标有两种方式能够让其消失,一种是在其所在行上使用武器,一种是在其所在列上使用武器。那么对于所有的目标而言,只要在行列满足之一的地方使用武器就可以全部清除目标。于是我们可以将目标所在行列进行匹配,然后再求最小顶点覆盖就可以了。因为最小顶点覆盖就是满足一条边至少有一个顶点在这个顶点集中。

代码如下:

#include 
#include
#include
#include
#define MAXN 1000using namespace std;int N, M, match[MAXN], visit[MAXN];int G[MAXN][MAXN];bool path(int u){ // visit[u] = 1; // 上式是错的,visit所使用的对象是与u对应的部分,所以不能在这一标记 for (int i = 1; i <= N; ++i) { if (!G[u][i] || visit[i]) { continue; } visit[i] = 1; // 考虑应该是y部的访问情况 if (!match[i] || path(match[i])) { match[i] = u; return true; } } return false;}int main(){ int x, y, ans = 0; scanf("%d %d", &N, &M); for (int i = 1; i <= M; ++i) { scanf("%d %d", &x, &y); G[x][y] = 1; } for (int i = 1; i <= N; ++i) { memset(visit, 0, sizeof (visit)); if (path(i)) { ++ans; } } printf("%d\n", ans); return 0; }

转载地址:http://piegl.baihongyu.com/

你可能感兴趣的文章
快递小哥逆袭自传:用了6年时间做到了IT部门主管
查看>>
程序coredump原因
查看>>
button只能点击一次的限制
查看>>
回调函数的理解
查看>>
STM32F767IGT6上电多次重启问题查找与解决
查看>>
hadoop
查看>>
Getting Started in OS Development开发自己的操作系统
查看>>
HEX文件格式
查看>>
JVM调优之:内存模型
查看>>
1.3列出文件属性 ls
查看>>
easyui filebox文件类型判断
查看>>
java.lang.IllegalArgumentException: java.net.UnknownHostException: hadoop.baizhiedu.com
查看>>
DIY Hadoop大数据五大注意点
查看>>
Jenkins安装
查看>>
安装配置Windbg
查看>>
Ubuntu系统安装nginx
查看>>
动态网页爬取
查看>>
php-nginx超时时间过短导致的post失败
查看>>
阿里面试题BIO和NIO数量问题附答案和代码
查看>>
Rails中的约定与命名规范
查看>>