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

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

                                                         拓扑排序

1.什么是拓扑排序?

对一个(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

也就是说排序后的一个顶点不存在指向他前面顶点的边。

2.拓扑排序的应用?

拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务。

3.怎样进行拓扑排序?

对于一个给定的图,先找到入度为0的点,那么这个点就是排序后的第一个顶点,然后将他指向顶点的入度减1,再寻找下一个入度为0的顶点直至找到所有顶点,但是拓扑排序不能应用在有环图中,因为有环图不存在入度为0的顶点。

int topsort(int x){    priority_queue
,greater
>q; int flag=0,k; int zeroflag=0; int num=0; memcpy(temp,in,sizeof(in)); for(int i=0;i
1) zeroflag=1; k=q.top(); q.pop(); num++; ans[num]=k+'A'; for(int i = 0 ; i < x; i++ ) if(map[k][i]==1 && --temp[i] == 0) q.push(i); } //cout<
<<" "<
<

========================================分隔符=============================================================

                                                                  POJ 1964 SORTING IT ALL

 

题目链接:

题目大意:对于n个大写字母,给你他们的关系,问经过多少个关系的判断后,可以判断出他们之见是否能够进行排序或者他们之间的关系有冲突

这道题对于每次输入的关系我们都要进行以此判断,除了样列外,比如给你以下三种关系,

A<B,B<C,C<A这时候很明显A,B,C之间形成了一个环,但是在输入了前两个关系后,我们就可以确定ABC三者之间的关系,所以答案应该输出的是可以排序而不是

存在环。

#include
#include
#include
using namespace std;#define maxn 50int n,m;int in[maxn],temp[maxn];bool map[maxn][maxn];char ans[maxn];int topsort(int x){ priority_queue
,greater
>q; int flag=0,k; int zeroflag=0; int num=0; memcpy(temp,in,sizeof(in)); for(int i=0;i
1) zeroflag=1; k=q.top(); q.pop(); num++; ans[num]=k+'A'; for(int i = 0 ; i < x; i++ ) if(map[k][i]==1 && --temp[i] == 0) q.push(i); } //cout<
<<" "<
<
>n>>m) { circleflag=0;orderflag=0; if(n==0&&m==0) return 0; memset(map,0,sizeof(map)); memset(in,0,sizeof(in)); for(int i=1;i<=m;i++) { scanf("%s",s); if(circleflag==0&&orderflag==0) { if(map[s[2]-'A'][s[0]-'A']==1) { circleflag=1; printf("Inconsistency found after %d relations.\n", i); continue; } if(map[s[0]-'A'][s[2]-'A']==0) { map[s[0]-'A'][s[2]-'A']=1; in[s[2]-'A']++; } int k=topsort(n); if(k==1) { circleflag=1; printf("Inconsistency found after %d relations.\n", i); } else if(k==-1) { orderflag=1; step=i; } } } if(circleflag==0&&orderflag==0) printf("Sorted sequence cannot be determined.\n"); else if(orderflag==1) { printf("Sorted sequence determined after %d relations: ", step); for(int i=1;i<=n;i++) { printf("%c",ans[i]); } printf(".\n"); } } return 0;}
AC CODE

对于题意还可以看这篇博客:

^-^

转载于:https://www.cnblogs.com/tombraider-shadow/p/11163489.html

你可能感兴趣的文章
【7集iCore3基础视频】7-4 iCore3连接示意图
查看>>
ASP.NET使网页弹出窗口不再困难
查看>>
Leetcode Balanced Binary Tree
查看>>
Day1:Spring-IoC、DI
查看>>
Leetcode 92. Reverse Linked List II
查看>>
TensorFlow2-维度变换
查看>>
Redux源码分析之createStore
查看>>
POJ 2060 最小路径覆盖
查看>>
label标签作用
查看>>
Selenium2之Web自动化编写配置(Java)
查看>>
windown快速安装xgboost
查看>>
tarjan(缩点)
查看>>
Lombok插件
查看>>
Linux上安装Libssh2
查看>>
自定义EL函数
查看>>
stm32的电源
查看>>
splice的多种用法
查看>>
20162304 2017-2018-1 《程序设计与数据结构》第二周学习总结
查看>>
九.python面向对象(双下方法内置方法)
查看>>
2018-09-12
查看>>