题目链接

题意

给出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)的更多相关文章

  1. ZOJ 1609 Equivalence(状压+dfs减枝)

    ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds      Memory Limit: 32768 KB When learning m ...

  2. bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1122  Solved: 80 ...

  3. 状压dfs小记

    一点前(tu)言(cao) 真的考起dfs来可谓是什么都能往dfs上套 状压不止能dp,还能与dfs结合成为搜索好(duliu)题 剪枝卡常司空见惯(打开题解一看并不是纯dfs,emmmm) 开始正文 ...

  4. codeforces 285 D. Permutation Sum 状压 dfs打表

    题意: 如果有2个排列a,b,定义序列c为: c[i] = (a[i] + b[i] - 2) % n + 1 但是,明显c不一定是一个排列 现在,给出排列的长度n (1 <= n <= ...

  5. BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )

    状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ...

  6. JZYZOJ1530 [haoi2013]开关控制 状压 dfs 折半搜索

    http://172.20.6.3/Problem_Show.asp?id=1530 元宵节快要到了,某城市人民公园将举办一次灯展.Dr.Kong准备设计出一个奇妙的展品,他计划将编号为1到N的N(1 ...

  7. 2018icpc南京网络赛-E AC Challenge(状压+dfs)

    题意: n道题,每道题有ai和bi,完成这道题需要先完成若干道题,完成这道题可以得到分数t*ai+bi,其中t是时间 1s, n<=20 思路: 由n的范围状压,状态最多1e6 然后dfs,注意 ...

  8. UVALive 6255 Kingdoms --状态搜索

    题意:n个国家,给出国家间相互的债务关系,每个国家如果债务>收入就要破产,破产后该国的所有债务关系全部清除,第一个破产的国家不同有可能造成最后的没破产的国家的不同,问哪些国家有可能成为独自存活的 ...

  9. hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)

    对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...

随机推荐

  1. WPF中Style文件的引用——使用xaml代码或者C#代码动态加载

    原文:WPF中Style文件的引用--使用xaml代码或者C#代码动态加载 WPF中控件拥有很多依赖属性(Dependency Property),我们可以通过编写自定义Style文件来控制控件的外观 ...

  2. WPF 4 DataGrid 控件(进阶篇一)

    原文:WPF 4 DataGrid 控件(进阶篇一)      上一篇<WPF 4 DataGrid 控件(自定义样式篇)>中,我们掌握了DataGrid 列表头.行表头.行.单元格相关的 ...

  3. 使注解@ContextConfiguration同时支持locations和classes

    @Configuration @ImportResource("classpath:META-INF/dataContext.xml") class TestConfig { } ...

  4. DSP Builder 12.0安装及crack方法

    在安装dsp_builder之前请确保已安装所需要的matlab版本 在此之前我已经安装了matlab R2011a,下面安装dsp builder 下面就是破解了,因为12.0的版本刚出,还没有相应 ...

  5. dotnet core 跨平台编译发布

    vs2017 建立的项目,在项目目录 ,执行 dotnet publish -r ubuntu.15.04-x64 dotnet publish -r linux-x64 dotnet publish ...

  6. WPF获取和设置应用程序范围的资源

    设置资源: Application.Current.Resources["ApplicationScopeResource"] = Brushes.White; 使用代码获取资源: ...

  7. 修改Android Studio默认的API Level(SDK版本)

    原文:修改Android Studio默认的API Level(SDK版本) Android Studio(2.1.2)新建工程的时候只会让你选择最低支持的SDK版本,默认的目标编译SDK版本会以系统 ...

  8. SpringMVC与uploadify结合进行上传

    uploadify是一个第三方js插件,支持多文件上传,拥有较为强大的上传功能 1.uploadify实现 下载其flash版本 http://www.uploadify.com/  解压后将其内容区 ...

  9. Twitter的分布式自增ID算法snowflake(雪花算法) - C#版

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的.有些时候我们希望能使用一种简 ...

  10. QTableWidget简单应用之文件浏览器

     实现下面这个简单的文件浏览功能,常用的QTableWidget设置都用到了.  基本设置 ui->tableWidget->setColumnCount(5); //设置表格列数 ui- ...