北大ACM3041——Asteroids~~最小顶点覆盖问题
2015-09-12 22:33
477 查看
题目的意思是:在N * N 的网格中,有K 个小行星,一个强大的武器,可以一次消灭一行或者一列的行星,求最少的发射武器的次数将所有行星消灭。
这个就是最小顶点覆盖问题。求解最小顶点覆盖问题很难,然而最大匹配数等于最小顶点覆盖。所以问题转换成最大匹配的求解。
AC代码:
这个就是最小顶点覆盖问题。求解最小顶点覆盖问题很难,然而最大匹配数等于最小顶点覆盖。所以问题转换成最大匹配的求解。
AC代码:
#include <iostream> #include <vector> using namespace std; //输入 int N, K; int R[10001], C[10001]; int V; //顶点数 vector<int> G[10001]; //图的邻接表 int match[10001]; //匹配的顶点 bool used[10001]; //DFS访问标记 void add_edge(int u, int v) //向图中增加一条连续的u和v 的边 { G[u].push_back(v); G[v].push_back(u); } bool dfs(int v) //寻找增广路 { used[v] = true; for(int i = 0; i < G[v].size(); i++) { int u = G[v][i], w = match[u]; if(w < 0 || !used[w] && dfs(w)) { match[v] = u; match[u] = v; return true; } } return false; } int matching() //求解最大匹配数 { int res = 0; memset(match, -1, sizeof(match)); for(int v = 0; v < V; v++) { if(match[v] < 0) { memset(used, 0, sizeof(used)); if(dfs(v)) res++; } } return res; } int main() { while(cin >> N >> K) { for(int i = 0; i < K; i++) cin >> R[i] >> C[i]; V = N * 2; for(int j = 0; j < K; j++) add_edge(R[j] - 1, N + C[j] - 1); cout << matching() << endl; } return 0; }
相关文章推荐
- mysql命令记录
- codeforces 264B B. Good Sequences(dp+数论)
- 1.4 git和github -4:开源项目协作
- 【转载】HTTP 头部解释
- JS弹出窗口代码大全
- 风机桨叶故障诊断(四) 正负样本准备——从图像中随机扣图
- 《剑指offer》和为S的连续正数序列
- WebService 页面重定向错误
- 省市联动 纯html+js
- CentOS6.5安装 MariaDB Galera Cluster 10.0
- 省市联动 纯html+js
- DFS矩阵构造+快速矩阵幂 hdu5434 Peace small elephant
- 如何成为一名卓越的前端工程师
- 一个app开发公司的基本人员
- 【私事】数码消费基金
- python中的 @ 修饰符
- Trie树-字典查找
- HTTP响应状态码大全
- mini2440烧写linu内核以及文件系统
- HDU 5432 Pyramid Split 二分