BZOJ4057 [Cerc2012]Kingdoms
题意
有一些王国陷入了一系列的经济危机。在很多年以前,他们私底下互相借了许多钱。现在,随着他们的负债被揭发,王国的崩溃不可避免地发生了……现在有n个王国,对于每对王国A和B,A欠B的钱被记为d_AB(我们假设有d_BA=-d_AB成立)。如果一个王国入不敷出(即需要支付超过所能获得的钱),它就可能破产。每当一个王国破产,与它相关的所有债务关系都会被去除,无论是正是负。而王国们的破产不是一瞬间完成的,而是第一个王国破产后,接下来可能破产的王国再继续破产,直到剩下的王国经济都是稳定的。不同的结局将取决于谁先破产,尤其是有的结局只会留下一个王国。请你计算,对于每个王国,是否存在一种结局使得该王国是唯一的幸存者。
\(n \leq 20\)
分析
一看到n=20,考虑状压dp。
用0/1背包\(f(s)\)表示能否以集合\(s\)中的王国作为幸存者。
转移就枚举每个点是否会破产,然后把破产后的状态赋为1即可。
时间复杂度\(O(T \cdot 2^n \cdot n^2)\),上限很松。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#include<stack>
#include<algorithm>
#include<cstring>
#define rg register
#define il inline
#define co const
template<class T>il T read()
{
	rg T data=0;
	rg int w=1;
	rg char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-')
			w=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		data=data*10+ch-'0';
		ch=getchar();
	}
	return data*w;
}
template<class T>T read(T&x)
{
	return x=read<T>();
}
using namespace std;
typedef long long ll;
co int MAXN=20;
int n,d[MAXN][MAXN];
bitset <1<<MAXN> ok;
void init()
{
	read(n);
	for(int i=0;i<(1<<n);++i)
		ok[i]=0;
	for(int i=0;i<n;++i)
		for(int j=0;j<n;++j)
			read(d[i][j]);
}
int tmp[MAXN],tcnt;
int ban[MAXN],bcnt;
void work()
{
	ok[(1<<n)-1]=1;
	for(int i=(1<<n)-1;i>=0;--i)
		if(ok[i])
		{
			tcnt=bcnt=0;
			for(int j=0;j<n;++j)
				if(i&(1<<j))
					tmp[tcnt++]=j;
			for(int x=0;x<tcnt;++x)
			{
				int sum=0;
				for(int y=0;y<tcnt;++y)
					sum+=d[tmp[x]][tmp[y]];
				if(sum>0)
					ban[bcnt++]=tmp[x];
			}
			for(int j=0;j<bcnt;++j)
				ok[i-(1<<ban[j])]=1;
		}
	tcnt=0;
	for(int i=0;i<n;++i)
		if(ok[1<<i])
			tmp[tcnt++]=i;
	if(tcnt>0)
	{
		for(int i=0;i<tcnt;++i)
			printf("%d ",tmp[i]+1);
		puts("");
	}
	else
		puts("0");
}
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int T=read<int>();
	while(T--)
	{
		init();
		work();
	}
	return 0;
}
BZOJ4057 [Cerc2012]Kingdoms的更多相关文章
- BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )
		状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ... 
- 4525: [Cerc2012]Kingdoms
		4525: [Cerc2012]Kingdoms 题意 n个国家,两两之间可能存在欠债或者被欠债的关系,一个国家破产:其支出大于收入.问一个国家能否坚持到最后. 思路 很有意思的一道题. dp[s]表 ... 
- BZOJ 4057: [Cerc2012]Kingdoms
		状压DP #include<cstdio> #include<cstring> using namespace std; int F[1200005],A[25][25],st ... 
- bzoj AC倒序
		Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ... 
- csuoj 1116: Kingdoms
		http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 1116: Kingdoms Time Limit: 3 Sec Memory Limit ... 
- BZOJ 4059: [Cerc2012]Non-boring sequences (  )
		要快速在一段子序列中判断一个元素是否只出现一次 , 我们可以预处理出每个元素左边和右边最近的相同元素的位置 , 这样就可以 O( 1 ) 判断. 考虑一段序列 [ l , r ] , 假如我们找到了序 ... 
- 4063: [Cerc2012]Darts
		4063: [Cerc2012]Darts Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 85 Solved: 53[Submit][Status] ... 
- 【BZOJ4061】[Cerc2012]Farm and factory(最短路,构造)
		[BZOJ4061][Cerc2012]Farm and factory(最短路,构造) 题面 BZOJ 然而权限题QwQ. 题解 先求出所有点到达\(1,2\)的最短路,不妨记为\(d_{u,1}, ... 
- UVA 12507 Kingdoms
		D - Kingdoms Time Limit:1000MS Memory Limit:0KB 64bit IO Format:%lld & %llu A kingdom ha ... 
随机推荐
- Java输出double类型中的最小正数和最大正数
			这是<写给大忙人看的java核心技术>中的一道练习题. 1. 输出最大正数值 System.out.println(Double.MAX_VALUE); 直接输出包装类Double的MAX ... 
- java开发中的重中之重-------mysql(基础篇)
			介绍: mysql是目前世界上最流行的关系型数据库,在国内大的互联网公司都在使用mysql数据库,mysql经常被我们这样概述,“mysql是轻量级关系型数据库”,其实轻量级并不是说mysql是中小型 ... 
- IOS-Storyboard全解析-第二部分
			[IOS] Storyboard全解析-第二部分 如果你想了解更多Storyboard的特性,那么你就来对了地方,下面我们就来接着上次的内容详细讲解Storyboard的使用方法. 在上一篇<S ... 
- IOS-如何锁定Xcode的API头文件
			如何锁定Xcode的API头文件1, 打开终端2, 前往Xcode.app, 命令: cd /Applications/Xcode.app3, 把头文件修改为只读, 命令: sudo chown -h ... 
- HTML5页面,用JS 禁止弹出手机键盘
			用户点击input的时候: 会默认调出手机软键盘: 场景:文本框获取焦点时,需要禁止手机弹出自带的输入键盘: 解决方案1: 用一个p/div等标签显示内容:然后放一个隐藏的input: (可能的场景: ... 
- jmeter的三种参数化
			以FTP请求(用户.密码)为例:(其他都相同) 1.文件参数化 使用配置元件中的CSV Data Set Config 配置CSV Data Set Config: 文件中存储ftp登录的用户名和密码 ... 
- console 代理
			window.log = function(){ if(!window.console ){ return; } var arr = [].slice.call(arguments); arr.uns ... 
- 微信红包算法TEST
			1.基本算法 设定总金额为10元,有N个人随机领取:N=1 则红包金额=X元: N=2 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数 第二个红包=10-第一个红包金 ... 
- Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
			Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ... 
- printf格式输出数字,位数不够前面补0,适用与输出编号
			printf格式输出数字,位数不够前面补0,适用与输出编号 printf格式输出:%[flags][width][.perc][F|N|h|l]type 用到了flags中的 0 (注意是零不是欧) ... 
