【CERC2012】【BZOJ4057】Kingdoms
2016-02-02 16:02
232 查看
Description
有一些王国陷入了一系列的经济危机。在很多年以前,他们私底下互相借了许多钱。现在,随着他们的负债被揭发,王国的崩溃不可避免地发生了……现在有n个王国,对于每对王国A和B,A欠B的钱被记为d_AB(我们假设有d_BA=-d_AB成立)。如果一个王国入不敷出(即需要支付超过所能获得的钱),它就可能破产。每当一个王国破产,与它相关的所有债务关系都会被去除,无论是正是负。而王国们的破产不是一瞬间完成的,而是第一个王国破产后,接下来可能破产的王国再继续破产,直到剩下的王国经济都是稳定的。不同的结局将取决于谁先破产,尤其是有的结局只会留下一个王国。请你计算,对于每个王国,是否存在一种结局使得该王国是唯一的幸存者。
Input
第一行一个正整数T,表示有T组数据。
每组数据第一行一个正整数n,表示有n个王国,1 <= n <= 20。
接下来n行,每行n个整数,第i行第j个整数表示d_ij,保证有d_ii = 0, d_ij = -d_ji, |d_ij| <= 10^6。
Output
每组数据输出一行,按照升序输出所有可能的王国编号,空格隔开,如果没有一个王国能满足条件,输出一个0。
Sample Input
1
3
0 -3 1
3 0 -2
-1 2 0
Sample Output
1 3
HINT
Source
鸣谢Tjz
状压DP一下
把memset变成手动赋值.赋值区间小了点,顿时从垫底变成了第8蛤蛤蛤
有一些王国陷入了一系列的经济危机。在很多年以前,他们私底下互相借了许多钱。现在,随着他们的负债被揭发,王国的崩溃不可避免地发生了……现在有n个王国,对于每对王国A和B,A欠B的钱被记为d_AB(我们假设有d_BA=-d_AB成立)。如果一个王国入不敷出(即需要支付超过所能获得的钱),它就可能破产。每当一个王国破产,与它相关的所有债务关系都会被去除,无论是正是负。而王国们的破产不是一瞬间完成的,而是第一个王国破产后,接下来可能破产的王国再继续破产,直到剩下的王国经济都是稳定的。不同的结局将取决于谁先破产,尤其是有的结局只会留下一个王国。请你计算,对于每个王国,是否存在一种结局使得该王国是唯一的幸存者。
Input
第一行一个正整数T,表示有T组数据。
每组数据第一行一个正整数n,表示有n个王国,1 <= n <= 20。
接下来n行,每行n个整数,第i行第j个整数表示d_ij,保证有d_ii = 0, d_ij = -d_ji, |d_ij| <= 10^6。
Output
每组数据输出一行,按照升序输出所有可能的王国编号,空格隔开,如果没有一个王国能满足条件,输出一个0。
Sample Input
1
3
0 -3 1
3 0 -2
-1 2 0
Sample Output
1 3
HINT
Source
鸣谢Tjz
状压DP一下
把memset变成手动赋值.赋值区间小了点,顿时从垫底变成了第8蛤蛤蛤
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define GET (ch>='0'&&ch<='9') #define MAXN 25 using namespace std; int T,n; int d[MAXN][MAXN]; int sta[MAXN],top; bool f[1<<21]; void in(int &x) { char ch=getchar();x=0;int flag=1; while (!GET) flag=(ch=='-')?-1:1,ch=getchar(); while (GET) x=x*10+ch-'0',ch=getchar();x*=flag; } int main() { in(T); while (T--) { in(n);top=0; for (int i=0;i<(1<<n);i++) f[i]=0; for (int i=0;i<n;i++) for (int j=0;j<n;j++) in(d[i][j]); f[0]=1; for (int i=0;i<(1<<n);i++) if (f[i]) for (int j=0;j<n;j++) if (!(i>>j&1)&&!f[i|(1<<j)]) { int sum=0; for (int k=0;k<n;k++) if (!(i>>k&1)) sum-=d[j][k]; if (sum<0) f[i|(1<<j)]=1; } for (int i=0;i<n;i++) if (f[((1<<n)-1)^(1<<i)]) sta[++top]=i+1; if (!top) {puts("0");continue;} sort(sta+1,sta+top+1); for (int i=1;i<=top;i++) printf(i!=top?"%d ":"%d\n",sta[i]); } }
相关文章推荐
- POJ 3254 - Corn Fields [状压DP]
- poj 2836
- poj 3254
- POJ 2441
- 2014 西安邀请赛状压DP
- Mega Man’s Missions
- 【2015新手赛网络赛】 1004 Good Subsets
- HDU 5561 【2015合肥现场赛】 Kingdom of Tree
- HDU 5135 Little Zu Chongzhi's Triangles (2014年广州赛区现场赛I题)
- 【PA2014】【BZOJ3717】Pakowanie
- 【SCOI2007】【BZOJ1072】排列perm
- Codevs2880 送外卖
- codeforces #302 Remembering Strings (dp)
- hdu 5418 Victor and World 状压DP
- Codeforces Round #235 (Div. 2) D. Roman and Numbers(状压dp)
- Codeforces Round #302 (Div. 2) E. Remembering Strings(状压dp)
- POJ 3254 Corn Fields (状压DP)
- poj(3254)——Corn Fields
- SDUT 3061 聪明的玛雅 (状压DP)
- POJ 3254 Corn Fields (状压DP+滚动数组)