`
pleasetojava
  • 浏览: 730043 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

有向无回路图拓扑排序C++实现

 
阅读更多

// 有向无回路图拓扑排序.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#define MAX 100
using namespace std;

enum Color{white,gray,black};
struct edgeNode
{
int no; //边尾端的序号
char info; //边端的名称
struct edgeNode * next; //下一个
};

struct vexNode
{
char info; //节点名称
struct edgeNode *link; //与之相连的端点
};

//存储节点信息
vexNode adjlist[MAX];
//访问层次
//还没访问为white,访问了但是还没完成它的所有后裔的搜索为gray
//完成它的所有后裔的搜索为black
Color color[MAX];
//访问的开始时间
int d[MAX];
//访问的完成时间
int f[MAX];
//前驱节点
int parent[MAX];
//拓扑排序后的数组,按照f[]的大小排序,即先完成搜索的节点排在前面
int topu[MAX];

//建立邻接表存储
//adjlist为节点集,n为节点个数,e为边数目
void createGraph(vexNode *adjlist,int n,int e)
{
int i;
for(i=1;i<=n;i++)
{
cout<<"请输入节点"<<i<<"的名称:";
cin>>adjlist[i].info;
adjlist[i].link = NULL;
}
edgeNode *p1;
int v1,v2;
for(i=1;i<=e;i++)
{
cout<<"请输入边"<<i<<"的起始节点序号:";
cin>>v1;
cout<<"请输入边"<<i<<"的尾节点序号:";
cin>>v2;
p1 = (edgeNode*)malloc(sizeof(edgeNode));
p1->no = v2;
p1->info = adjlist[v2].info;
p1->next = adjlist[v1].link;
adjlist[v1].link = p1;
}
}

//深度优先搜索有向无权图
//parent[i]为节点i前驱节点,time为一个全局时间戳,v是第几个节点,index是topu数组的全局偏移
void DFS(vexNode *adjlist,int *parent,int &time,int v,int &index)
{
color[v] = gray;
time += 1;
d[v] = time;
int i;
edgeNode *p;
p = adjlist[v].link;
while(p != NULL)
{
if(color[p->no]==white)
{
parent[p->no] = v;
DFS(adjlist,parent,time,p->no,index);
}
p = p->next;
}
color[v] = black;
time += 1;
f[v] = time;
topu[index++] = v;
}
int _tmain(int argc, _TCHAR* argv[])
{
int cases;
cout<<"请输入案例的个数:";
cin>>cases;
while(cases--)
{
int n,e;
cout<<"请输入节点数:";
cin>>n;
cout<<"请输入边数:";
cin>>e;
//访问节点的时间戳
int time = 0;
//index是topu数组的全局偏移
int index = 1;
//访问标志清空与前驱节点都初始化为0
int i;
for(i=1;i<=n;i++)
{
color[i] = white;
parent[i] = 0;
}
//创建邻接表
createGraph(adjlist,n,e);
for(i=1;i<=n;i++)
{
if(color[i]==white)
DFS(adjlist,parent,time,i,index);
}
cout<<"输出拓扑排序结果:"<<endl;
for(i=1;i<=n;i++)
cout<<adjlist[topu[i]].info<<" ";
cout<<endl;
}
system("pause");
return 0;
}

----------------------------------------------------程序测试---------------------------------------------------

请输入案例的个数:1
请输入节点数:9
请输入边数:9
请输入节点1的名称:a
请输入节点2的名称:b
请输入节点3的名称:c
请输入节点4的名称:d
请输入节点5的名称:e
请输入节点6的名称:f
请输入节点7的名称:g
请输入节点8的名称:h
请输入节点9的名称:i
请输入边1的起始节点序号:1
请输入边1的尾节点序号:2
请输入边2的起始节点序号:1
请输入边2的尾节点序号:4
请输入边3的起始节点序号:2
请输入边3的尾节点序号:3
请输入边4的起始节点序号:4
请输入边4的尾节点序号:3
请输入边5的起始节点序号:5
请输入边5的尾节点序号:6
请输入边6的起始节点序号:5
请输入边6的尾节点序号:8
请输入边7的起始节点序号:6
请输入边7的尾节点序号:4
请输入边8的起始节点序号:6
请输入边8的尾节点序号:8
请输入边9的起始节点序号:7
请输入边9的尾节点序号:8
输出拓扑排序结果:
c d b a h f e g i
请按任意键继续. . .

分享到:
评论

相关推荐

    拓扑排序算法

    利用拓扑排序判断有向图是否存在一个简单又向回路,若存在,输出该回路

    判断一个有向图中是否存在回路,并进行输出(拓扑算法)

    标题中的“判断一个有向图中是否存在...总之,解决这个问题需要理解有向图、环的概念,掌握深度优先搜索和拓扑排序的算法,并能用C++实现这些算法。在实际编程中,还需要考虑错误处理和输入验证,确保程序的健壮性。

    拓扑排序的实现

    拓扑排序是针对有向无环图(Directed Acyclic Graph, DAG)的一种排序方法。它将DAG中的顶点按照一定的顺序排列,使得对于任意一对顶点u和v,如果图中存在一条从u到v的路径,则在拓扑排序后的序列中,u一定排在v前面...

    利用循环队列实现AOV 网的拓扑排序

    AOV网(Activity On Vertex 网)是一种特殊的有向图,用于描述活动之间的相互关系。拓扑排序是AOV网中的一种基本操作,用于将网中的顶点排序,使得每个顶点的入度值为0。拓扑排序是一种非常重要的算法,它广泛应用于...

    判断有向图中的回路

    由于拓扑排序只适用于无环图,因此我们可以利用这个特性来检测有向图中是否存在回路。 以下是实现这个功能的一种常见方法,使用深度优先搜索(DFS)或广度优先搜索(BFS): 1. **深度优先搜索(DFS)**:从任意未...

    拓扑排序与关键路径.pptx

    在给定的问题中,小雯想要知道班级的成绩排名,这可以通过构建一个有向图来实现,其中每个顶点代表一个同学,有向边表示分数高低关系。例如,如果 A 的分数高于 B,那么就有一条从 A 指向 B 的边。通过拓扑排序,...

    关于求有向图简单回路问题的例子

    在有向图中,简单回路是指一条不重复经过任何顶点的路径,从某个顶点出发,最终回到该顶点形成一个闭合路径。在编程领域,寻找有向图中的简单回路是一项常见的任务,尤其是在图论和数据结构的学习中。 对于这个问题...

    SCC 算法设计 c++

    在本例中,可能使用了栈来实现拓扑排序,这是一种对有向无环图(DAG)进行排序的方法,可以揭示哪些节点在拓扑上是前驱和后继。 2. **深度优先搜索(DFS)**:DFS是一种遍历或搜索树或图的算法,它从根节点开始,...

    Graph Theory Codes in C用C++写的复杂网络图论算法.rar

    Koenig's Theorem指出,一个有向图有欧拉回路当且仅当所有的节点的入度等于出度。 8. **色数问题**:四色定理是图论中的经典问题,表明任何平面图都可以用不超过四种颜色进行染色,使得相邻的顶点颜色不同。这在...

    top_sort.rar_Success

    在"描述"中提到,“如图g无回路”,意味着图g是一个有向无环图,拓扑排序可以成功执行,否则如果存在回路,则无法进行有效的拓扑排序,因为回路的存在会导致至少一个顶点无法在所有前驱顶点之后出现,所以返回"FAIL...

    图的应用与实现.doc

    前者在邻接表存储的有向图上执行,返回一个无回路的拓扑排序序列。后者不仅要求排序,还要求找出每个顶点最早发生的时间。 6. **关键路径算法**`CriticalPath`在有向网中寻找关键活动,这些活动的延迟会影响项目的...

    C++ 图论的基本应用

    对于有向无环图(DAG),拓扑排序将顶点排成线性序列,使得对于每一条有向边 (u, v),顶点 u 都在顶点 v 之前。Kahn算法和DFS都可以实现拓扑排序。 6. **二分查找法在图论中的应用:** - Ford-Fulkerson算法:...

    数据结构用C语言写的无向图的算法

    综上所述,用C语言实现无向图的算法时,需要掌握图的逻辑结构、存储结构(邻接矩阵和邻接表)、遍历算法(DFS和BFS)、最小生成树算法、最短路径算法以及拓扑排序等核心知识。在实际编程中,根据图的特性选择合适的...

    数据结构图的c++课件

    4. **拓扑排序**:有向无环图(DAG)的顶点排序,使得对于每条边(u, v),u总是在v之前。 5. **强连通分量**:Tarjan算法或Kosaraju算法用于找出有向图的强连通分量。 在C++实现这些概念时,可以采用邻接矩阵或邻接表...

    数据结构电子笔记C++版6

    在无向图中,边是无方向的,而在有向图中,边是有方向的,称为弧。 无向完全图是任意两个顶点之间都存在边的图,边的数量为n×(n-1)/2。有向完全图则是每个顶点对之间都有两条方向相反的弧,边的数量为n×(n-1)。图...

    TUOPUPAIXU.rar_visual c

    拓扑排序是图论中的一个重要概念,它适用于有向无环图(DAG,Directed Acyclic Graph)。在这样的图中,拓扑排序能够为节点提供一种线性的顺序,使得对于任何有向边 `(u, v)`,节点 `u` 总是在节点 `v` 之前。这种...

    C++实现景区信息管理系统

    2. **导游线路图的创建与输出**:景区分布图通常用图数据结构表示,这里采用邻接链表存储(带权无向图),以便快速访问和修改景点间的关系。邻接矩阵用于输出图的可视化表示,权值无穷大可以用32767来模拟。 3. **...

    操作系统课程设计—有向前趋图的实现

    2. **拓扑排序**:对于有向无环图(DAG),可以进行拓扑排序,得到一个没有前驱的任务列表,这在某些调度场景下很有用。 3. **安全性检查**:根据资源分配矩阵和需求矩阵,检查是否存在一种安全序列,即从图中找到一个...

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    20.4.1 拓扑排序 595 20.4.2 生成树 598 20.4.3 最小生成树 600 20.4.4 最短路径 603 20.4.5 回路 606 20.4.6 一些复杂问题 608 第21章 外部存储中的数据处理 615 21.1 了解外部存储 616 21.2 排序外部文件...

Global site tag (gtag.js) - Google Analytics