poj 1636 Prison rearrangement
| Time Limit: 3000MS | Memory Limit: 10000K | |
| Total Submissions: 2158 | Accepted: 971 |
Description
Input
Output
Sample Input
3
101 0
3 3
1 2
1 3
1 1
8 12
1 1
1 2
1 3
1 4
2 5
3 5
4 5
5 5
6 6
7 6
8 7
8 8
Sample Output
50
0
3
原文地址
题目意思:两个监狱,各有n个犯人,每个两个监狱之间一些犯人之间有一定的关系,对于有关系的犯人不能放在同一个监狱,原状态肯定是满足的,
因为存在这种关系的不存在同一个监狱的。求最大交换次数使得条件依然满足,并且交换次数不能超过n/2。 后记:我们两队的比赛题,琨哥说题目很水,我信了,这能水,唉,高估我们能力了,主要是用到 dfs + o1 背包问题,但是的确很难想到,我还想着用并查集呢,不会,参考了下别人的代码;
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int SIZE = ;
int m;
int r;
//map[i][j]表示i和j是否会冲突
int map[SIZE][SIZE];
//A组里的人数
int aSize;
//b组里的人数
int bSize;
//dp[i][j] 表示用A组的i个人换B组的j个人是否可行
bool dp[SIZE][SIZE];
//visited[0][i] 表示用A组中的点i是否被访问过
//visited[1][i] 表示用B组中的点i是否被访问过
bool visited[][SIZE];
void Init()
{
memset( map, , sizeof(map) );
memset( visited, , sizeof(visited) );
memset( dp, , sizeof(dp) );
}
void Input()
{
cin >> m >> r;
for( int i=; i<r; i++ )
{
int a, b;
cin >> a >> b;
map[a][b] = ;
}
}
//side=0 表示当前正在搜索A组
//side=1 表示当前正在搜索B组
//id 表示当前正在搜索的编号
void DFS( int side, int id )
{
visited[side][id] = true;
//如果当前搜索的是A组
if( side == )
{
//记录A组中的元素个数
aSize++;
for( int i=; i<=m; i++ )
{
//搜索的是B组中对应的点
if( map[id][i] && !visited[][i] )//看一组的 id ,是否有和二组的 i ,相连的不,并且二组的没有被标记;
{
DFS( , i ); //搜寻一组中是否有与二组相连的数;
}
}
}
else
{
bSize++;
for( int j=; j<=m; j++ )
{
if( map[j][id] && !visited[][j] )
{
DFS( , j );
}
}
}
}
//利用二维背包计算
void Knapsack()
{
dp[][] = true;
for( int x=m/; x>=aSize-; x-- )
{
for( int y=m/; y>=bSize-; y-- )
{
if( dp[x][y] || dp[x - aSize][y - bSize] )
{
// printf("%d %d\n",x,y);
dp[x][y] = true;
}
}
}
}
void Output()
{
for( int i=m/; i>=; i-- )
{
if( dp[i][i] ) // dp[i][i]; 表示各方都拿出来 i 个人,进行交换;
{
cout << i << endl;
break;
}
}
}
int main()
{
int caseNum;
cin >> caseNum;
while( caseNum-- )
{
Init();
Input();
for( int i=; i<=m; i++ )
{
//跳过已经处理过的节点
if( visited[][i] ) continue;
//计算A、B中的人数
aSize = ;
bSize = ;
DFS( , i ); // 搜索一次,就出现两组不相容的团体;
//利用二维背包计算
Knapsack();
}
for( int i=; i<=m; i++ )
{
if( visited[][i] ) continue;
aSize = ;
bSize = ;
DFS( , i );
Knapsack();
}
Output();
}
return ;
}
poj 1636 Prison rearrangement的更多相关文章
- POJ 1636 Prison rearrangement DFS+0/1背包
题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS Memor ...
- POJ 1636 DFS+DP
思路: 先搜索出来如果选这个点 其它哪些点必须选 跑个背包就好了 //By SiriusRen #include <cstdio> #include <cstring> #in ...
- poj 动态规划题目列表及总结
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
- poj动态规划列表
[1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...
- POJ 动态规划题目列表
]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322 ...
- poj 动态规划的主题列表和总结
此文转载别人,希望自己可以做完这些题目. 1.POJ动态规划题目列表 easy:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, ...
- [转] POJ DP问题
列表一:经典题目题号:容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 13 ...
- POJ动态规划题目列表
列表一:经典题目题号:容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 13 ...
- dp题目列表
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
随机推荐
- Android内存优化7 内存检测工具1 Memory Monitor检测内存泄露
上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...
- 转-"进程android.process.acore已意外停止" 解决办法
运行手机虚拟机时,老是弹出这样的“android.process.acore“服务已意外停止,虽不影响正常使用,但终究影响心情.网上找的方案,按如下步骤操作,可以解决问题: 出现这个提示不用担心,并不 ...
- 关于Java代码优化的44条建议!
关于Java代码优化的N条建议! 本文是作者:五月的仓颉 结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,作者的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼 ...
- iOS:KVC和KVO
来源: 对月流 链接:http://www.jianshu.com/p/f1393d10109d 写在前面: 关于KVC和KVO各种博客多了去了,重新整理下,就当是温习一下吧,也还算是个新手,不对的 ...
- go语言基础之匿名变量和多重赋
1.匿名变量 package main //必须有一个main包 import "fmt" func test() (a, b, c int) { return 1, 2, 3 } ...
- js调用高德地图的搜索api
var city = $('#city')[0].value; AMap.plugin(['AMap.Autocomplete'],function(){ var autoOptions = { ci ...
- TensorFlow进阶(一)----张量的阶和数据类型
张量的阶和数据类型 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通.其实张量更 ...
- BST数据结构题
给定BST.改动BST,使得每一个点都是大于他的结点的值之和 关键是这题递归參数怎么设计,每一个点比他大的有两快.一个是右子书(假设有的话),还有一个是祖先里面比他大的,假设直接用这两个的话,找不到递 ...
- 【树莓派】Box相关手册-4 Web代理
在盒子上安装配置web代理,通过此代理,用户访问盒子的内网地址实现web portal访问.目前我们使用tinyproxy作为web代理 安装: >sudo apt-get install ti ...
- SQLiteOpenHelper 源码
package com.tongyan.common.db; /** * Copyright (C) 2007 The Android Open Source Project * * Licensed ...