博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1094拓扑排序
阅读量:5344 次
发布时间:2019-06-15

本文共 1618 字,大约阅读时间需要 5 分钟。

      该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列。是典型的拓扑排序,但输出格式上确有三种形式:

   1.该字母序列有序,并依次输出;

   2.该序列不能判断是否有序;

   3.该序列字母次序之间有矛盾,即有环存在。

     而这三种形式的判断是有顺序的:先判断是否有环(3),再判断是否有序(1),最后才能判断是否能得出结果(2)。注意:对于(2)必须遍历完整个图,而(1)和(3)一旦得出结果,对后面的输入就不用做处理了。

代码如下:

 

#include
<
stdio.h
>
#include
<
string
.h
>
int
 map[
27
][
27
],indegree[
27
],q[
27
];
int
 TopoSort(
int
 n) 
//
拓扑排序
{
    
int
 c
=
0
,temp[
27
],loc,m,flag
=
1
,i,j;  
///
/flag=1:有序 flag=-1:不确定
    
for
(i
=
1
;i
<=
n;i
++
)
        temp[i]
=
indegree[i];
    
for
(i
=
1
;i
<=
n;i
++
)
    {
        m
=
0
;
        
for
(j
=
1
;j
<=
n;j
++
)
            
if
(temp[j]
==
0
) { m
++
; loc
=
j; }  
//
查找入度为零的顶点个数
        
if
(m
==
0
return
 
0
;  
//
有环
        
if
(m
>
1
) flag
=-
1
;  
//
 无序
        q[c
++
]
=
loc;   
//
入度为零的点入队
        temp[loc]
=-
1
;
        
for
(j
=
1
;j
<=
n;j
++
)
            
if
(map[loc][j]
==
1
) temp[j]
--
;
    }
    
return
 flag;
}
int
 main()
{
    
int
 m,n,i,sign;  
//
当sign=1时,已得出结果
    
char
 str[
5
];
    
while
(scanf(
"
%d%d
"
,
&
n,
&
m))
    {
        
if
(m
==
0
&&
n
==
0
break
;
        memset(map,
0
,
sizeof
(map));
        memset(indegree,
0
,
sizeof
(indegree));
        sign
=
0
;
        
for
(i
=
1
;i
<=
m;i
++
)
        {
            scanf(
"
%s
"
,str);
            
if
(sign) 
continue
//
一旦得出结果,对后续的输入不做处理
            
int
 x
=
str[
0
]
-
'
A
'
+
1
;
            
int
 y
=
str[
2
]
-
'
A
'
+
1
;
            map[x][y]
=
1
;
            indegree[y]
++
;
            
int
 s
=
TopoSort(n);
            
if
(s
==
0
//
有环
            {
                printf(
"
Inconsistency found after %d relations.\n
"
,i);
                sign
=
1
;
            }
            
if
(s
==
1
//
有序
            {
                printf(
"
Sorted sequence determined after %d relations: 
"
,i);
                
for
(
int
 j
=
0
;j
<
n;j
++
)
                    printf(
"
%c
"
,q[j]
+
'
A
'
-
1
);
                printf(
"
.\n
"
);
                sign
=
1
;
            }
        }
        
if
(
!
sign) 
//
不确定
            printf(
"
Sorted sequence cannot be determined.\n
"
);
    }
    
return
 
0
;
}

 

 

 

转载于:https://www.cnblogs.com/yueshuqiao/archive/2011/08/16/2140485.html

你可能感兴趣的文章
php中eval函数的危害与正确禁用方法
查看>>
20172315 2017-2018-2 《程序设计与数据结构》第十一周学习总结
查看>>
MySQL添加、修改、撤销用户数据库操作权限的一些记录
查看>>
关于谷歌浏览器Chrome正在处理请求的问题解决
查看>>
Git核心技术:在Ubuntu下部署Gitolite服务端
查看>>
平面波展开法总结
查看>>
建造者模式
查看>>
ArraySort--冒泡排序、选择排序、插入排序工具类demo
查看>>
composer 安装laravel
查看>>
8-EasyNetQ之Send & Receive
查看>>
Android反编译教程
查看>>
List<string> 去重复 并且出现次数最多的排前面
查看>>
js日志管理-log4javascript学习小结
查看>>
Android之布局androidmanifest.xml 资源清单 概述
查看>>
How to Find Research Problems
查看>>
Linux用户管理
查看>>
数据库第1,2,3范式学习
查看>>
《Linux内核设计与实现》第四章学习笔记
查看>>
使用iperf测试网络性能
查看>>
图片的显示隐藏(两张图片,默认的时候显示第一张,点击的时候显示另一张)...
查看>>