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.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...
随机推荐
- DESTOON系统文章模块默认设置第一张图片为标题图的方法
连上FTP或者其他方法打开网站目录下的\module\article\admin\template\edit.tpl.php修改设置内容第 <input name="post[thum ...
- .h文件和.cpp文件
//新建如图文件 //在头文件.h中声明,在.cpp中实现 //main.cpp代码如下 #define _CRT_SECURE_NO_WARNINGS #include<iostream> ...
- Scala学习文档-访问修饰符
在scala里,对保护成员的访问比Java严格.Scala中,保护成员只在定义了成员的类的子类中可以访问,而Java中,还允许在同一个包的其他类中访问. package p1 { class FCla ...
- angularjs学习笔记—事件指令
ngClick 适用标签:所有触发条件:单击 #html <div ng-controller="LearnCtrl"> <div ng-click=" ...
- DLog 技巧
#ifdef DEBUG#ifndef DLog# define DLog(fmt, ...) {NSLog((@"%s [Line %d] " fmt), __PRETTY_FU ...
- WCF-基本知识
WCF-基本知识 (1)WCF服务元数据交换方式介绍: WCF服务有两种方案可以发布自己的元数据.一种是基于HTTP-GET协议提供元数据:另一种则为MEX终结点元数据交换方式,和WCF服务一样使用一 ...
- FJ省队集训DAY3 T2
思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...
- poj1740 A New Stone Game
题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆. 真是好♂题,代码不长就是好♂题. 首先考虑两堆相同的 ...
- Linux tr 命令使用
man tr: TR(1) User Commands TR(1) NAME tr - translate or delete characters SYNOPSIS tr [OPTION]... S ...
- SQL之用户自定义函数
关于SQL Server用户自定义的函数,有标量函数.表值函数(内联表值函数.多语句表值函数)两种. 题外话,可能有部分朋友不知道SQL Serve用户自定义的函数应该是写在哪里,这里简单提示一下,在 ...