Kingdoms
来源:互联网 发布:暖气管道钥匙 淘宝 编辑:程序博客网 时间:2024/05/22 14:52
Kingdoms
题意:
有编号1..n的国家,之间以有向边连接,边的信息表示了一个国家对另一个国家的负债和债权情况。现在寻找资不抵债(破产)的国家,将其从图中抹去,这样它的负债和债权也被一并抹去。问,重复进行上述操作后有哪些国家可能是最终剩下的那一个。若有,则按它们编号的升序输出;若无,则输出0。
思路:
采用一种枚举的思路,用dfs枚举破产国家的各种组合,状态就用二十位的二进制位来表示:1表示破产,0表示正常。
具体实现方式见代码。现在用文字简单阐述一下算法过程。
采用位运算,直接将一个32位整形数作为保存状态的容器,对它的每一位进行枚举,做上标记(即按位或上一个1);用一个元素数量不少于
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <queue>using namespace std;const int maxn = 1048586;int n;bool bankruptcyStatus[maxn];int g[21][21];vector<int> res;void init(){ res.clear(); memset(bankruptcyStatus, false, sizeof(bankruptcyStatus));}/*函数参数 *state:它的二进制形式表示破产国家列表 *num:表示已经破产的国家数 */void dfs(int state, int num){ bankruptcyStatus[state] = true; if(num == n - 1){ for(int i = 0; i < n; i++) if(!(state & (1<<i))) res.push_back(i+1); } for(int i = 0; i < n; i++){ // 引入bankruptcyStatus数组防止从多种路径到达已经计算过的同一种状态,达到剪枝的目的 if(!(state&(1<<i)) && !bankruptcyStatus[state|(1<<i)]){ int d = 0; for(int j = 0; j < n; j++){ if(!(state&(1<<j))) d += g[i][j]; } if(d > 0) dfs(state|(1<<i), num+1); } }}int main(){#ifdef TESTfreopen("test.txt", "r", stdin);#endif // TEST cin >> n; while(cin >> n){ init(); for(int i = 0; i <n; i++){ for(int j = 0; j < n; j++){ scanf("%d", &g[i][j]); } } dfs(0,0); if(!res.size()) printf("0\n"); else{ sort(res.begin(), res.end()); for(int i = 0; i < res.size(); i++) printf("%d%c", res[i], " \n"[i==res.size()-1]); } } return 0;}
阅读全文
0 0
- Kingdoms
- Kingdoms UVA
- hdu 3442 Three Kingdoms
- FZU - 1981 Three kingdoms
- Sicily 1914. Kingdoms
- CSU 1116 Kingdoms
- CSU 1116 Kingdoms
- HDU 3442 Three Kingdoms
- 【bzoj4057】[Cerc2012]Kingdoms
- 【CERC2012】【BZOJ4057】Kingdoms
- HDU 3442 Three Kingdoms
- CSUOJ 1116 Kingdoms
- UVALive 6255 Kingdoms
- UVALive 6255 Kingdoms --状态搜索
- 【BZOJ4057】【Cerc2012】Kingdoms 状压DP
- Kingdoms 枚举+最小生成树
- UVALive 6255-状态搜索-Kingdoms
- hdu 3442 Three Kingdoms(ACM 暑假比赛)
- Android性能优化之渲染优化
- Tomcat配置管理控制台
- ArrayList,Vector, LinkedList的存储性能和特性
- Google Guava 中文指南
- 35.面向对象
- Kingdoms
- 第二周项目4-体验复杂度汉诺塔问题
- robust scene text recognition with automatic rectification
- Swagger
- C# 编写Windows Service(windows服务程序)
- 阿里笔试和视频一面 2017.9
- Android下的OOM异常、内存抖动和界面卡顿
- 解析 nginx启动期做了哪些事
- javascript中的window事件