本题要求输出所有拓扑排序的序列。

还好本题的数据量不是非常大。限制在26个大写英文字母,故此能够使用递归法输出。

这个递归输出所有解在Leetcode非常多这种题目的,不小心的话,还是非常难调试的。

整体考了递归和拓扑排序,还有推断能否够拓扑排序-就是是否图有环。

考了三大知识点。难度还是有的。由于数据量不大,故此推断环能够使用一般递归方法。递归仅仅须要注意细节就好了。

#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
const int ALPHA = 26;
bool gra[ALPHA][ALPHA];
int id = 0, len = 0;
const int MAX_B = 512;
char buf[MAX_B]; char getFromBuf()
{
if (id >= len)
{
len = fread(buf, 1, MAX_B, stdin);
id = 0;
}
return buf[id++];
} struct Subset
{
int p, r;
}; Subset subs[ALPHA]; int findParent(int u)
{
if (u != subs[u].p) subs[u].p = findParent(subs[u].p);
return subs[u].p;
} void unionTwo(int x, int y)
{
int xroot = findParent(x);
int yroot = findParent(y);
if (subs[xroot].r < subs[yroot].r) subs[xroot].p = yroot;
else
{
subs[yroot].p = xroot;
if (subs[yroot].r == subs[xroot].r) subs[xroot].r++;
}
} void initSubs()
{
for (int i = 0; i < ALPHA; i++)
{
subs[i].p = i;
subs[i].r = 0;
}
} bool isCycle()
{
initSubs();
for (int i = 0; i < ALPHA; i++)
{
for (int j = 0; j < ALPHA; j++)
{
if (i == j || !gra[i][j]) continue;
int ip = findParent(i);
int jp = findParent(j);
if (ip == jp) return true;
unionTwo(i, j);
}
}
return false;
} int rs[ALPHA];
bool vis[ALPHA];
void printAllTopologicalOrders(int N, int rsid = 0)
{
if (rsid == N) //递归究竟了,打印结果
{
if (rsid > 0) putchar(rs[0]+'A');
for (int i = 1; i < rsid; i++)
{
putchar(' ');
putchar(rs[i]+'A');
}
putchar('\n');
return ;
}
for (int i = 0; i < ALPHA; i++)
{
if (vis[i]) continue;//这里要推断,漏了这句。好难dubg啊。 要细致用脑去模拟过程才干发现!! ! if (!gra[i][i]) continue; //没有这个点,跳过
int j = 0;
for ( ; j < ALPHA; j++)//检查i是否有入度
{
if (i != j && !vis[j] && gra[j][i]) break;
}
if (j == ALPHA) //找到入度为零的点i了
{
vis[i] = true;
rs[rsid] = i;
printAllTopologicalOrders(N, rsid+1);
vis[i] = false;
}
}
} int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int N = 0;
memset(gra, 0, sizeof(gra));
char a = getFromBuf();
while ((a == '\n' || a == ' ') && len) a = getFromBuf();
while (a != '\n' && len)
{
if ('A' <= a && a <= 'Z')
{
gra[a-'A'][a-'A'] = 1;//代表有点
N++;
}
a = getFromBuf();
} while ((a == '\n' || a == ' ') && len) a = getFromBuf();
while (a != '\n' && len)
{
int u = a - 'A';
a = getFromBuf(); a = getFromBuf();
int v = a - 'A'; gra[u][v] = 1; a = getFromBuf();
if (a == '\n') break;
a = getFromBuf();
}
fill(vis, vis+ALPHA, false);
if (isCycle()) puts("NO");
else
{
printAllTopologicalOrders(N);
}
if (T) putchar('\n');
}
return 0;
}

UVa 872 - Ordering 输出全拓扑排序的更多相关文章

  1. UVA - 10305 Ordering Tasks(拓扑排序)

    题意:给定优先关系进行拓扑排序. 分析:将入度为0的点加入优先队列,并将与之相连的点入度减1,若又有度数为0的点,继续加入优先队列,依次类推. #pragma comment(linker, &quo ...

  2. UVa 10305 Ordering Tasks【拓扑排序】

    题意:给出n件事情,m个二元组关系,求它们的拓扑序列 用的队列来做 #include<iostream> #include<cstdio> #include<cstrin ...

  3. Ordering Tasks(拓扑排序+dfs)

    Ordering Tasks John has n tasks to do. Unfortunately, the tasks are not independent and the executio ...

  4. UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

    题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排 ...

  5. UVA10305:Ordering Tasks(拓扑排序)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  6. UVA - 12263 Rankings 模拟(拓扑排序)

    题意:1~n这n个数,给你一个初始的顺序,再告诉你那两个数的大小关系发生了变化,求变化后的 顺序,不存在则输出IMPOSSIBLE 思路:这题很遗憾没在比赛的时候过掉,结束后加了一行就AC了.题目真的 ...

  7. UVA-10305 Ordering Tasks (拓扑排序)

    题目大意:给出n个点,m条关系,按关系的从小到大排序. 题目分析:拓扑排序的模板题,套模板. kahn算法: 伪代码: Kahn算法: 摘一段维基百科上关于Kahn算法的伪码描述: L← Empty ...

  8. UVA 10305:Ordering Tasks(拓扑排序)

    #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...

  9. hdu 2647 (拓扑排序 邻接表建图的模板) Reward

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...

随机推荐

  1. Emmet Documentation

    src:http://docs.emmet.io/cheat-sheet/ Emmet Documentation Syntax   Child: > nav>ul>li <n ...

  2. iOS开发之自定义画板

    今天整好有时间, 写了一个自定义的画板!  [我的github] GLPaint主要采用QuartzCore框架, 对画布上的元素进行渲染, 然后通过UIImageWriteToSavedPhotos ...

  3. canvas仿黑客帝国的字符下落

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  4. csu 10月 月赛 F 题 ZZY and his little friends

    一道字典树异或的题,但是数据比较水,被大家用暴力给干掉了! 以前写过一个类似的题,叫做the longest xor in tree: 两个差不多吧! 好久没写字典树了,复习一下! 代码: #incl ...

  5. EasyUI 树形菜单tree 定义图标

    { "id":1, "text":"Folder1", "iconCls":"icon-save", ...

  6. Master Nginx(1) - Installing Nginx and Third-Party Modules

    Installing NGINX and Third-Party Modules Installing Nginx using a package manager Linux(deb-based) s ...

  7. 【转】 viewpage禁止滑动--android

    原文网址:http://blog.csdn.net/weiyage/article/details/8175108 最近写一个项目,涉及到viewpager,而变态的客户要求不滑动. 方法很简单 重写 ...

  8. VS发布,TFS邮件设置截图

    vs2012发布截图: TFS邮件设置截图:

  9. Python生成器 yield

    迭代器与list相比较,就for in句型循环拿数据而言: 用list写很简洁,但如果list数据过大,会很消耗资源. 用iteration 迭代器写,则不会消耗那么多资源.他会随用随取,用一个拿一个 ...

  10. 算法 python实现(一) 基本常识

    我算法和数据结构都不好,笨的一比. 现在的目标是熟悉常见和经典算法,看本站两个大牛的博客,在这也推荐一下,特别好,除了算法其他的技术也很不错. Vamei : http://www.cnblogs.c ...