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

本文共 1183 字,大约阅读时间需要 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; }

转载于:https://www.cnblogs.com/Lyush/archive/2012/07/02/2573422.html

你可能感兴趣的文章
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
javascript学习---BOM
查看>>
IOS-每个程序员的编程之路上都应该看这11本书
查看>>
自定义tabbar(纯代码)
查看>>
extjs fieldset 和 radio
查看>>
小程序底部导航栏
查看>>
Codeforces Gym101505G:Orchard Division(扫描线+线段树第k大)
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
tensorflow实现迁移学习
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
关于Redis处理高并发
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
asp.net core 系列 16 Web主机 IWebHostBuilder
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>