poj1270 Following Orders
来源:互联网 发布:典型数据报表图片 编辑:程序博客网 时间:2024/06/03 21:58
poj1270
在找入度0的拓扑排序算法基础上,加入回溯,对入度被减掉的点进行还原,即可找到所有拓扑序列。对于字典序最小可以先对原序列排序。
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;int g[30][30], in[30], tp[30], n;char s[30];int getit(int ch){ for(int i = 1; i < n; i++) if(s[i] == ch) return i;}bool init(){ char ch; n = 0; while((ch = getchar()) != '\n'){ if(ch == EOF) return false; if(ch != ' ') s[++n] = ch; } s[++n] = '\0'; sort(s+1, s+n); memset(in, 0, sizeof(in)); memset(g, 0, sizeof(g)); while(true){ while((ch = getchar()) == ' '); if(ch == EOF) return false; if(ch == '\n') break; int u = getit(ch); while((ch = getchar()) == ' '); int v = getit(ch); g[u][v] = 1; in[v]++; } return true;}void dfs(int now){ if(now == n){ for(int i = 1; i < n; i++) printf("%c", s[tp[i]]); puts(""); return; } for(int i = 1; i < n; i++){ if(in[i] == 0){ in[i] = -1; tp[now] = i; for(int j = 1; j < n; j++) if(g[i][j]) in[j]--; dfs(now+1); in[i] = 0; for(int j = 1; j < n; j++) if(g[i][j]) in[j]++; } }}void work(){ while(init()){ dfs(1); puts(""); }}int main(){ work(); return 0;}
0 0
- poj1270 - Following Orders
- POJ1270--Following Orders
- poj1270 Following Orders
- poj1270 Following Orders
- poj1270 Following Orders
- POJ1270 Following Orders(拓扑排序)
- POJ1270 Following Orders(拓扑排序+回溯)
- poj1270 Following Orders (拓扑排序+回溯输出路径)
- POJ 1270 Following Orders
- poj 1270 Following Orders
- buct1766 Following Orders
- UVa124 - Following Orders
- POJ 1270 Following Orders
- Following Orders(拓扑排序)
- POJ-1270 Following Orders
- POJ 1270 Following Orders
- POJ 1270 Following Orders
- poj 1270 Following Orders
- hdu 2108 Shape of HDU
- NCPC2015 A Adjoin the Networks(求树的直径)
- 使用NSFileManager枚举目录种的内容(遍历目录)
- 前端学习之路——盒子模型练习
- 序列相关
- poj1270 Following Orders
- 丑数(空间换时间)
- 【EmbeddedDev】搭建你的BeagleBot遥控车
- 外网访问本机工具花生壳和ngrok
- Linux系统中“动态库”和“静态库”那点事儿
- Qt5之串口编程入门篇之写数据
- 第二周项目3-复杂度(2)
- spring aop annotation execute order
- 怎样理解条件概率公式