#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MID(x,y) ((x+y)>>1)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MAXE = 2000;
const int MAXV = 30;
struct node{
int u, v;
int next;
}arc[MAXE];
int cnt, head[MAXV], ind[MAXV];
void init(){
cnt = 0;
mem(head, -1);
mem(ind, 0);
return ;
}
void add(int u, int v){
arc[cnt].u = u;
arc[cnt].v = v;
arc[cnt].next = head[u];
head[u] = cnt ++;
return ;
}
bool vis[MAXV];
vector tsort;
vector tmp;
queue Q;
void topsort1(int n){
tmp.clear();
while(!Q.empty()){
Q.pop();
}
mem(ind, 0);
mem(vis, 0);
for(int i = 0; i < cnt; i ++){
ind[arc[i].v] ++;
}
int num = 0;
for (int i = 0; i < n; i ++){
if (ind[i] == 0){
num ++;
Q.push(i);
vis[i] = 1;
}
}
while(!Q.empty()){
int u = Q.front();
Q.pop();
tmp.push_back(u);
for (int i = head[u]; i != -1; i = arc[i].next){
int v = arc[i].v;
if (!vis[v]){
ind[v] --;
if (ind[v] == 0){
Q.push(v);
vis[v] = 1;
}
}
}
}
return ;
}
bool topsort(int n){
tsort.clear();
while(!Q.empty()){
Q.pop();
}
mem(ind, 0);
mem(vis, 0);
for(int i = 0; i < cnt; i ++){
ind[arc[i].v] ++;
}
int num = 0;
for (int i = 0; i < n; i ++){
if (ind[i] == 0){
if (num > 0){
return false;
}
else{
num ++;
Q.push(i);
vis[i] = 1;
}
}
}
while(!Q.empty()){
if (Q.size() > 1)
return false;
int u = Q.front();
Q.pop();
tsort.push_back(u);
for (int i = head[u]; i != -1; i = arc[i].next){
int v = arc[i].v;
if (!vis[v]){
ind[v] --;
if (ind[v] == 0){
Q.push(v);
vis[v] = 1;
}
}
}
}
return true;
}
int n, m;
int main(){
//freopen("B.1.dat","r+",stdin);
//freopen("B.1.out","w+",stdout);
while(scanf("%d %d", &n, &m)){
if (n + m == 0)
break;
init();
int ok = 0;
int i;
char s[4];
for (i = 1; i <= m; i ++){
scanf("%s", s);
add(s[0]-65, s[2]-65);
topsort1(n);
if ((int)tmp.size() < n){
printf("Inconsistency found after %d relations.\n", i);
ok = 1;
break;
}
if (topsort(n)){
ok = 1;
printf("Sorted sequence determined after %d relations: ", i);
for (int j = 0; j < (int)tsort.size(); j ++){
printf("%c", tsort[j]+65);
}
puts(".");
break;
}
}
for (i ++;i <= m; i ++){
scanf("%s", s);
}
if (ok == 0){
puts("Sorted sequence cannot be determined.");
}
}
return 0;
}
POJ 1094 Sorting It All Out (拓扑排序)
转载
题意:给你一些大写字母间的偏序关系,然后让你判断能否唯一确定它们之间的关系,或者所给关系是矛盾的,或者到最后也不能确定它们之间的关系。
由DAG图节点的偏序关系确定节点的排序可以由拓扑排序求出。而确定这些问题也可以由拓扑排序完成。
我们知道拓扑排序的过程是:
1.每次从队列中找出1个入度为0的点作为当前排序的点(加入到已排序的集合中)
2.从图中删除以这个点为起点的弧(即使所有的终点入度减1)
3.如果找不到入度为0的点则退出过程
那么我们来看拓扑排序的过程中怎么判断这几个问题:
1.如果某次找入度为0的点时有多个入度为0的点,则无法确定关系;
2.如果找不到入度为0的点退出过程,但是并不是所有的点都已经确定排序,则图中一定有环,即关系是矛盾的。
题目还隐形地要求判断矛盾在无法确定关系之前,所以我笨拙地用了两次拓扑排序,第一次确定是否矛盾,第二次再判断能否确定关系。
举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
排序算法之计数排序的优化
排序算法之计数排序的优化
数组 计数排序 最小值 -
poj 1094 Sorting It All Out 拓扑排序
题目:http://poj.org/problem?id=1094题意:给定n个字母,和m
拓扑排序 poj #include i++ -
poj 1094 Sorting It All Out (拓扑排序)
链接:poj 1094题意:给定一系列关系(仅仅存在大写字母),推断是否存
拓扑排序 #include i++ 结点 字符数组