HDU 4619 Warm up 2(贪心、并查集 | 二分图最大独立集)
来源:互联网 发布:ifile是什么软件 编辑:程序博客网 时间:2024/05/22 07:41
题意:
1∗2的多米诺骨牌,n≤1000个横向的,m≤1000个纵向的
横向的之间互相没有交点,纵向也是
现要删掉几个,求剩下的最都没有交点的个数
分析:
一开始想只删纵的或者横的,然后反例就是这种图形
显然答案是4,删掉一横一纵
然后新的贪心姿势就来了,还是由于题目那个已知
应该是每个连通块,只留下横的或者竖的,留下多的那个
然后就能搞了,时间复杂度是O(n+m)
其实这是一个二分图,然后没交点就是二分图最大独立集。。。
时间复杂度是O(n2),边数最多是2n
贪心代码:
//// Created by TaoSama on 2016-02-28// Copyright (c) 2016 TaoSama. All rights reserved.//#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << " "#define prln(x) cout << #x << " = " << x << endlconst int N = 2e3 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;int n, m;struct DSU { int n, m; int r[N], p[N]; int row[N], col[N]; void init(int _n, int _m) { n = _n; m = _m; for(int i = 1; i <= n + m; ++i) { p[i] = i; r[i] = 0; if(i <= n) row[i] = 1, col[i] = 0; else row[i] = 0, col[i] = 1; } } int find(int x) { return p[x] = p[x] == x ? x : find(p[x]); } void unite(int x, int y) { x = find(x), y = find(y); if(x == y) return; if(r[x] > r[y]) swap(x, y); p[x] = y; if(r[x] == r[y]) ++ r[y]; row[y] += row[x]; row[x] = 0; col[y] += col[x]; col[x] = 0; } int get() { int ret = 0; for(int i = 1; i <= n + m; ++i) {// printf("%d: %d %d\n", i, row[i], col[i]); ret += max(row[i], col[i]); } return ret; }} dsu;int row[105][105];int main() {#ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); while(scanf("%d%d", &n, &m) == 2 && (n || m)) { dsu.init(n, m); memset(row, 0, sizeof row); for(int i = 1; i <= n; ++i) { int x, y; scanf("%d%d", &x, &y); row[x][y] = i, row[x + 1][y] = i; } for(int i = 1; i <= m; ++i) { int x, y; scanf("%d%d", &x, &y); if(row[x][y + 1]) dsu.unite(n + i, row[x][y + 1]); if(row[x][y]) dsu.unite(n + i, row[x][y]); } int ans = dsu.get(); printf("%d\n", ans); } return 0;}
0 0
- HDU 4619 Warm up 2(贪心、并查集 | 二分图最大独立集)
- hdu 4619 Warm up 2 (二分图最大独立集)
- hdu 4619 Warm up 2 (两种解法:1.并查集 2.最大独立集)
- hdu 4619 Warm up 2(并查集)
- hdu 4619 Warm up 2_最大独立集
- HDU 4619 Warm up 2 最大独立集
- HDU 4619 Warm up 2(最大独立集)
- hdu 4619 Warm up 2(二分图最大匹配)
- HDU 4619 Warm up 2 (并查集)
- HDU 4619 Warm up 2(点独立集)
- hdu4619 Warm up 2 (最大独立集)
- hdu 4619 Warm up 2 ( 二分图最大匹配 )
- HDU 4619 Warm up 2 (二分图最小覆盖集)
- HDU 4619 Warm up 2 (二分图最小覆盖集)
- HDU 4619 —— Warm up 2(二分图最大匹配)
- HDU 4619 Warm up 2(最大流或二分匹配)
- hdu 4619 Warm up 2 (二分图)
- hdu 4619 Warm up 2[二分匹配]
- 支付宝接口
- 反射(Reflection)
- 如何实现动态规划?——TWO
- ubuntu---从网页上下载文件到当前目录 和 从本地上传文件到当前目录
- HDU 4618 Palindrome Sub-Array(Manacher、二分)
- HDU 4619 Warm up 2(贪心、并查集 | 二分图最大独立集)
- Java学习源代码学习(总一天我能够学习源码!)
- Java学习源代码学习
- HDU 4620 Fruit Ninja Extreme(搜索)
- ncurses笔记(1)——ncurses库的介绍与安装
- CentOS6.5安装mysql5.7.11
- LeetCode Add Digits
- codeblocks 搭建opencv
- laravel的学习历程