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,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...
随机推荐
- 自设chrome默认滚动条样式
今天无聊,想着chrome这种全面使用html的浏览器,可不可以让我自行改变它的默认CSS呢,结果去查查,有,很好 win7/8目录为 C:\Users\[你的用户名]\AppData\Local\G ...
- 深入探究JavaScript中的比较问题
先用最近遇到的几个问题做引子: 1 console.log(null==undefined); //true 2 console.log(null==false);//false 3 console. ...
- 反编译Android APK及防止APK程序被反编译
怎么逆向工程对Android Apk 进行反编译 google Android开发是开源的,开发过程中有些时候会遇到一些功能,自己不知道该怎么做,然而别的软件里面已经有了,这个时候可以采用反编译的方式 ...
- ImageButton和Button区别
一.基础准备 Imagebutton 继承 Imageview,就是用一个图标代表了一些文字,它没Android:text属性.它由Android:src指定图标的位置 android:s ...
- Eclipse里初次使用Maven注意问题
在Eclipse里初次使用Maven,右键project->add dependency, 发现search不管用,这时候需要按照以下步骤操作: Goto "Preferences - ...
- SQL Server GOTO使用实例详解
GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行.语法:GOTO 标识符标识符需要在其名称后加上一个冒号“:”.例如:“33:”,“loving:.SQL语句如下:DE ...
- PS命令删除所有EXCHANGE2013内用户邮件
因为在测试的时间产生了大量测试邮件,所以在正式上线前,要删除所有用户的邮件. 命令如下: Get-Mailbox | Search-Mailbox -DeleteContent
- 【POJ3169 】Layout (认真的做差分约束)
Layout Description Like everyone else, cows like to stand close to their friends when queuing for ...
- 【Android开发经验】ViewHolder到底用什么修饰?static?final?static final?
其实一上来我就贴一张图就ok了,因为这几种完全一样,不管用什么修饰,ViewHolder都会初始化当前界面可见item的数量+1次,和convertView的实例化次数是一样的,因此,我么不管使用什么 ...
- (转载)使用JavaScript操作表单
(转载)http://www.blogjava.net/junglesong/archive/2008/03/02/183263.html 使用JavaScript操作表单 获取表单的引用 在开始对表 ...