UVa 872 - Ordering 输出全拓扑排序
本题要求输出所有拓扑排序的序列。
还好本题的数据量不是非常大。限制在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 输出全拓扑排序的更多相关文章
- UVA - 10305 Ordering Tasks(拓扑排序)
题意:给定优先关系进行拓扑排序. 分析:将入度为0的点加入优先队列,并将与之相连的点入度减1,若又有度数为0的点,继续加入优先队列,依次类推. #pragma comment(linker, &quo ...
- UVa 10305 Ordering Tasks【拓扑排序】
题意:给出n件事情,m个二元组关系,求它们的拓扑序列 用的队列来做 #include<iostream> #include<cstdio> #include<cstrin ...
- Ordering Tasks(拓扑排序+dfs)
Ordering Tasks John has n tasks to do. Unfortunately, the tasks are not independent and the executio ...
- UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)
题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排 ...
- UVA10305:Ordering Tasks(拓扑排序)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- UVA - 12263 Rankings 模拟(拓扑排序)
题意:1~n这n个数,给你一个初始的顺序,再告诉你那两个数的大小关系发生了变化,求变化后的 顺序,不存在则输出IMPOSSIBLE 思路:这题很遗憾没在比赛的时候过掉,结束后加了一行就AC了.题目真的 ...
- UVA-10305 Ordering Tasks (拓扑排序)
题目大意:给出n个点,m条关系,按关系的从小到大排序. 题目分析:拓扑排序的模板题,套模板. kahn算法: 伪代码: Kahn算法: 摘一段维基百科上关于Kahn算法的伪码描述: L← Empty ...
- UVA 10305:Ordering Tasks(拓扑排序)
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...
- hdu 2647 (拓扑排序 邻接表建图的模板) Reward
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...
随机推荐
- 根据WSDL生成代理类方式(2)
运行开发人员工具提示 输入命令行svcutil http://localhost:8080/Test/TestClassPort?wsdl
- bzoj 3858: Number Transformation 暴力
3858: Number Transformation Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 82 Solved: 41[Submit][Sta ...
- ACMer程序员智力拾遗
浏览网页偶得,遂记录下来,每天进步一点点-- 博客园真是个不错的平台,今天我让师姐也注册了-- 学会分享吧,孩子们-- 一.编程中无穷大量的设置 ...
- Word文献类型标志
文献类型标识:专著:M:论文集:C:报纸文章:W:期刊文章:J:学位论文:D:研究报告:R:各种未定类型的文献:Z文献类型标识:专著:M:论文集:C:报纸文章:W:期刊文章:J:学位论文:D:研究报告 ...
- 超级 Ping 监测工具——为您的网络状态保驾护航
关于 Ping Ping 是一个网络命令,主要是用于确定本地主机是否能与另一台主机交换(发送与接收)数据.根据返回的信息,就可以推断 TCP/IP 参数是否设置得正确以及运行是否正常.正常情况下,Pi ...
- [topcoder]NinePuzzle
http://community.topcoder.com/stat?c=problem_statement&pm=11225&rd=14427 http://apps.topcode ...
- [收藏转贴]WCFRESTFul服务搭建及实现增删改查
RESTful Wcf是一种基于Http协议的服务架构风格, RESTful 的服务通常是架构层面上的考虑. 因为它天生就具有很好的跨平台跨语言的集成能力,几乎所有的语言和网络平台都支持 HTTP ...
- 测试用(编写优质嵌入式C程序)
注:相比于Word,如果使用CSDN自带编辑器写出结构清晰的文档,需要花费更多的时间,所以我尝试将我写的一些word文档转换为图片发布,这样就可以保持原来的结构.字体,可以获得更好的可读性.图片的分辨 ...
- Python自然语言处理学习笔记(69)
http://www.cnblogs.com/yuxc/archive/2012/02/09/2344474.html Chapter8 Analyzing Sentence Structure ...
- Cursor的moveToFirst和moveToNext
参考: http://blog.csdn.net/kerlw/article/details/6126448 总结: 查询得到的cursor是指向第一条记录之前的,因此查询得到cursor后第一次调用 ...