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

还好本题的数据量不是非常大。限制在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. cocos2d-x笔记5: 通过jni实现C++调用Java

    Cocos2d-x的跨平台性很强大,但是偶尔也需要平台的原生API结合. C++在Win32平台下简单的很,C++可以直接用MFC或者调用Win32API. Ios在XCode下直接就能C++和OC混 ...

  2. windows2003网络负载平衡设置

    问题 随着计算机技术的不断发展,单台计算机的性能和可靠性越来越高.但现实中还是有许多应用是单台计算机难以达到,例如: 1.银行存储用户数据的数据库服务器必须保证24小时不间断的运转,并在发生严重硬件故 ...

  3. 【转】成为Java顶尖程序员 ,看这11本书就够了

    成为Java顶尖程序员 ,看这11本书就够了 转自:http://developer.51cto.com/art/201512/503095.htm 以下是我推荐给Java开发者们的一些值得一看的好书 ...

  4. Js 中json简单处理

    Json2.js下载地址 json常用处理 Json字符串 var str = '{"code":10,"msg":"codemsg",&q ...

  5. skiplist 跳表(2)-----细心学习

    快速了解skiplist请看:skiplist 跳表(1) http://blog.sina.com.cn/s/blog_693f08470101n2lv.html 本周我要介绍的数据结构,是我非常非 ...

  6. 第 15 章 组合模式【Composite Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 大家在上学的时候应该都学过“数据结构”这门课程吧,还记得其中有一节叫“二叉树”吧,我们上 学那会儿这一章节是必考内容,左 ...

  7. [topcoder]CorrectMultiplicationTwo

    http://community.topcoder.com/stat?c=problem_statement&pm=11609&rd=14547 http://apps.topcode ...

  8. C++开发与Windows API

    Windows API 向 C++ 开发人员提出了一项挑战. 组成 API 的众多库大都表现为 C 语言风格的函数和句柄或是 COM 风格的接口. 这些用起来都不太方便,需要进行一定的封装或间接操作. ...

  9. 【Spring】Spring IOC原理及源码解析之scope=request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  10. Eclipse中如何恢复已删除文件

    [转自] http://zhangjunhd.blog.51cto.com/113473/23092