UVALive 6255:Kingdoms(状压DFS)
题意
给出n个王国和n*n的矩阵,mp[i][j] 代表第 i 个王国欠第 j 个王国 mp[i][j] 块钱。如果当前的王国处于负债状态,那么这个王国就会被消除,和它相连的王国的债务都会被清除。因此会产生连锁反应,使得最后可能只剩下一个王国。输出对于每种情况,最后可能只剩下的王国有哪些。
思路
一开始的想法就是DFS+状压,但是TLE了,队友和我说没记录状态,那样的复杂度差不多是O(n!)的。后面队友写了一个,疯狂WA。
想了好久都没发现的错误:当时做法是全局记录一个原始的图和一个当前的图,每次修改当前的图(修改双向边),然后DFS完又复原回去,这样会错误。
但是这里修改只要修改单向边就可以了,因为如果把行也修改了,复原的时候把行也复原的话,可能本来在这个状态是被删除的,但是又被复原回去了。
有一个比较暴力的做法就是局部开一个图,然后放进去,最后再放回来。这样肯定不会出错,就是比较耗时。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int N = 20 + 11;
int dp[1<<21], mp[N][N], init[N][N], sum[N], n;
vector<int> ans;
int dfs(int st, int rem) {
if(~dp[st]) return dp[st];
if(rem == 1) return dp[st] = 1;
dp[st] = 0;
for(int i = 0; i < n; i++) {
if((st >> i) & 1) {
int tmp = 0;
for(int j = 0; j < n; j++)
tmp -= mp[i][j];
if(tmp >= 0) continue;
for(int j = 0; j < n; j++)
mp[j][i] = 0;
dfs(st ^ (1 << i), rem - 1);
for(int j = 0; j < n; j++)
mp[j][i] = init[j][i];
}
}
}
int main() {
int t; scanf("%d", &t);
while(t--) {
scanf("%d", &n);
memset(sum, 0, sizeof(sum));
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &mp[i][j]), init[i][j] = mp[i][j];
memset(dp, -1, sizeof(dp));
dfs((1 << n) - 1, n);
ans.clear();
for(int i = 0; i < n; i++)
if(dp[1<<i] == 1) ans.push_back(i + 1);
int sz = ans.size();
if(!sz) puts("0");
else for(int i = 0; i < sz; i++)
printf("%d%c", ans[i], i + 1 == sz ? '\n' : ' ');
} return 0;
}
/*
1
3
0 -3 1
3 0 -2
-1 2 0
*/
UVALive 6255:Kingdoms(状压DFS)的更多相关文章
- ZOJ 1609 Equivalence(状压+dfs减枝)
ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds Memory Limit: 32768 KB When learning m ...
- bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)
1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1122 Solved: 80 ...
- 状压dfs小记
一点前(tu)言(cao) 真的考起dfs来可谓是什么都能往dfs上套 状压不止能dp,还能与dfs结合成为搜索好(duliu)题 剪枝卡常司空见惯(打开题解一看并不是纯dfs,emmmm) 开始正文 ...
- codeforces 285 D. Permutation Sum 状压 dfs打表
题意: 如果有2个排列a,b,定义序列c为: c[i] = (a[i] + b[i] - 2) % n + 1 但是,明显c不一定是一个排列 现在,给出排列的长度n (1 <= n <= ...
- BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )
状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ...
- JZYZOJ1530 [haoi2013]开关控制 状压 dfs 折半搜索
http://172.20.6.3/Problem_Show.asp?id=1530 元宵节快要到了,某城市人民公园将举办一次灯展.Dr.Kong准备设计出一个奇妙的展品,他计划将编号为1到N的N(1 ...
- 2018icpc南京网络赛-E AC Challenge(状压+dfs)
题意: n道题,每道题有ai和bi,完成这道题需要先完成若干道题,完成这道题可以得到分数t*ai+bi,其中t是时间 1s, n<=20 思路: 由n的范围状压,状态最多1e6 然后dfs,注意 ...
- UVALive 6255 Kingdoms --状态搜索
题意:n个国家,给出国家间相互的债务关系,每个国家如果债务>收入就要破产,破产后该国的所有债务关系全部清除,第一个破产的国家不同有可能造成最后的没破产的国家的不同,问哪些国家有可能成为独自存活的 ...
- hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)
对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...
随机推荐
- [转帖 ]MySQL 5.7 新特性 JSON
MySQL 5.7 新特性 JSON 的创建,插入,查询,更新 作者: 我不是鱼 (2016-08-31 16:13)分类: MySQL 标签: MySQL JSON MySQL JSON 应用 ...
- Matlab随笔之三维图形绘制
1.三维曲线 用到了plot3函数.plot3(x,y,z)用来绘制3维曲线图,而不能绘制曲面图!就是把所有的(x,y,z)点连接在一起. t=linspace(,*pi,); x=sin(t); y ...
- IOS开发之把 JSON 数据转化成 Arrays 或者 Dictionaries
1 前言通过 NSJSONSerialization 这个类的 JSONObjectWithData:options:error:方法来实现,把JSON 数据解析出来放在数据或者字典里面保存. 2 代 ...
- WPF 数据模板使用值转换器
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- js 注册事件
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- python 安装 win 下的exe结尾的文件操作
1.首先下载相关的模块 2.把下载的相关模块放到python 安装目录下 3.cmd 切换到python的安装目录下 例如:{PIL-1.1.7.win32-py2.7.exe} 4.执行 pip i ...
- 『开发技巧』Python音频操作工具PyAudio上手教程
『开发技巧』Python音频操作工具PyAudio上手教程 0.引子 当需要使用Python处理音频数据时,使用python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包. ...
- Z-Order
The z-order of a window indicates the window's position in a stack of overlapping windows. This wind ...
- 《C标准库》阅读笔记
<assert.h>的断言函数适合于用来调试,实际产品中难以使用. #define NDEBUG 可禁用断言. #undef NDEBUG 可打开断言. 我自己写的一个例子: #inclu ...
- NUMA 架构
NUMA架构的CPU -- 你真的用好了么? - http://cenalulu.github.io/linux/numa/ SQL Server 如何支持 NUMA - https://docs.m ...