POJ1636 动态规划+并查集
问题重述:
两个监狱中各有m个囚犯,欲对这两个监狱中的囚犯进行等数量的交换。已知某些囚犯不能关押在同一个监狱,求解可以交换人数的最大值k (k < m/2)。
分析:
假设监狱1中的囚犯a与监狱2中的囚犯b不能共存。那么假如对a进行交换,也必须对b进行交换。因此,根据互斥关系建立的连通集两边的成员必须同时进行交换。
求解步骤:
1) 根据已知的互斥关系,采用并查集建立连通集,分别记录每个连通集在两个监狱中的成员数目,记为v1, v2。
2) 采用动态规划算法,用布尔变量dp[i][j]表示监狱1中i个囚犯与监狱2中的j个囚犯进行交换的可行性。则有dp[i][j] = dp[i – v1[k]][j – v2[k]]
3) 满足dp[i][i] = 1, i < m/2的i的最大值即所求的解。
//Memory: 580K Time: 63MS
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
;
int m, r;
bool g[maxn][maxn];
int f[maxn];
int nl[maxn];
int nr[maxn];
bool vis[maxn];
int v1[maxn], v2[maxn];
int cnt;
bool dp[maxn][maxn];
void makeset()
{
memset(f, , sizeof(f));
memset(nl, , sizeof(nl));
memset(nr, , sizeof(nr));
; i <= * m; i++)
f[i] = i;
; i <= m; i++) {
nl[i] = ;
nr[i] = ;
}
+ m; i <= m * ; i++) {
nr[i] = ;
nl[i] = ;
}
}
int find(int a) {
if (f[a] == a) return a;
f[a] = find(f[a]);
return f[a];
}
void uni(int a, int b) {
int sa = find(a);
int sb = find(b);
if (sa != sb) {
f[sa] = sb;
nl[sb] += nl[sa];
nr[sb] += nr[sa];
}
}
void init()
{
makeset();
; i <= m; i++) {
; j <= m * ; j++) if (g[i][j]) {
uni(i, j);
}
}
cnt = ;
; i <= m * ; i++) {
int s = find(i);
if (s == i) {
v1[cnt] = nl[s];
v2[cnt++] = nr[s];
}
}
}
int main()
{
int cas;
cin >> cas;
while (cas--) {
memset(g, , sizeof(g));
scanf("%d%d", &m, &r);
int a, b;
; i < r; i++) {
scanf("%d%d", &a, &b);
g[a][b + m] = ;
}
init();
memset(dp, , sizeof(dp));
dp[][] = ;
; i < cnt; i++) {
; j >= ; j--) ////此处必须进行倒序循环:每次循环的dp都由上一轮循环后序号较小的dp确定,倒序循环避免提前更新序号较小的dp
; k >= ; k--) { //同上
&& k + v2[i] <= m/)
dp[j + v1[i]][k + v2[i]] = ;
}
}
; i >= ; i--) {
if (dp[i][i]) {
cout << i <<endl;
break;
}
}
}
;
}
POJ1636 动态规划+并查集的更多相关文章
- POJ1417 True Liars 并查集 动态规划 (种类并查集)
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1417 题意概括 有一群人,p1个好人,p2个坏人. 他们说了n句话.(p1+p2<=600,n ...
- 【2019.10.7 CCF-CSP-2019模拟赛 T3】未知的数组(unknown)(并查集+动态规划)
预处理 考虑模数\(10\)是合数不好做,所以我们可以用一个常用套路: \(\prod_{i=l}^ra_i\equiv x(mod\ 10)\)的方案数等于\(\prod_{i=l}^ra_i\eq ...
- [POJ2054]Color a Tree (并查集+贪心)
POJ终于修好啦 题意 和UVA1205是同一题,在洛谷上是紫题 有一棵树,需要给其所有节点染色,每个点染色所需的时间是一样的都是11.给每个点染色,还有一个开销“当前时间×ci×ci”,cici是每 ...
- POJ-1456 Supermarket(贪心,并查集优化)
Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10725 Accepted: 4688 Descript ...
- POJ 1417 - True Liars - [带权并查集+DP]
题目链接:http://poj.org/problem?id=1417 Time Limit: 1000MS Memory Limit: 10000K Description After having ...
- POJ1417 True Liars —— 并查集 + DP
题目链接:http://poj.org/problem?id=1417 True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- leetcode 76 dp& 强连通分量&并查集经典操作
800. Similar RGB Color class Solution { int getn(int k){ return (k+8)/17; } string strd(int k){ char ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- 关押罪犯 and 食物链(并查集)
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...
随机推荐
- A + B Problem,hdu-1000
A + B Problem Problem Description Calculate A + B. Input Each line will contain two integers A and ...
- Java学习笔记--String StringBuffer StringBuilder
String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...
- 《转》JAVA动态代理(JDK和CGLIB)
该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的 ...
- 最近写的页面,含有大量的ajax
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib ur ...
- [POJ] 2239 Selecting Courses(二分图最大匹配)
题目地址:http://poj.org/problem?id=2239 Li Ming大学选课,每天12节课,每周7天,每种同样的课可能有多节分布在不同天的不同节.问Li Ming最多可以选多少节课. ...
- (摘)DataGuard物理standby管理 - 主备切换
DataGuard物理standby管理 - 主备切换 Dataguard的切换分为两种,switchover和failover. switchover一般用于数据库或硬件升级,这时只需要较短时间中断 ...
- CCI_chapter 3 Stacks and Queues
3.1Describe how you could use a single array to implement three stacks for stack 1, we will use [0, ...
- Oracle中对列加密的方法
Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col ...
- SelectSort 选择排序
//SelectSort (( O(n²))) public class TestSelectSort { public int[] selectSortArray(int[] arr){ int m ...
- Android Studio编译好的apk放在哪里?
Eclipse中编译好的apk文件时在bin文件中面的,可是在Android Studio有一个比較大的修改了,编译好的apk在android studio里面是直接看不到了,并且apk文件所在文件夹 ...