// 有向无回路图拓扑排序.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网(Activity On Vertex 网)是一种特殊的有向图,用于描述活动之间的相互关系。拓扑排序是AOV网中的一种基本操作,用于将网中的顶点排序,使得每个顶点的入度值为0。拓扑排序是一种非常重要的算法,它广泛应用于...
由于拓扑排序只适用于无环图,因此我们可以利用这个特性来检测有向图中是否存在回路。 以下是实现这个功能的一种常见方法,使用深度优先搜索(DFS)或广度优先搜索(BFS): 1. **深度优先搜索(DFS)**:从任意未...
在给定的问题中,小雯想要知道班级的成绩排名,这可以通过构建一个有向图来实现,其中每个顶点代表一个同学,有向边表示分数高低关系。例如,如果 A 的分数高于 B,那么就有一条从 A 指向 B 的边。通过拓扑排序,...
在有向图中,简单回路是指一条不重复经过任何顶点的路径,从某个顶点出发,最终回到该顶点形成一个闭合路径。在编程领域,寻找有向图中的简单回路是一项常见的任务,尤其是在图论和数据结构的学习中。 对于这个问题...
在本例中,可能使用了栈来实现拓扑排序,这是一种对有向无环图(DAG)进行排序的方法,可以揭示哪些节点在拓扑上是前驱和后继。 2. **深度优先搜索(DFS)**:DFS是一种遍历或搜索树或图的算法,它从根节点开始,...
Koenig's Theorem指出,一个有向图有欧拉回路当且仅当所有的节点的入度等于出度。 8. **色数问题**:四色定理是图论中的经典问题,表明任何平面图都可以用不超过四种颜色进行染色,使得相邻的顶点颜色不同。这在...
在"描述"中提到,“如图g无回路”,意味着图g是一个有向无环图,拓扑排序可以成功执行,否则如果存在回路,则无法进行有效的拓扑排序,因为回路的存在会导致至少一个顶点无法在所有前驱顶点之后出现,所以返回"FAIL...
前者在邻接表存储的有向图上执行,返回一个无回路的拓扑排序序列。后者不仅要求排序,还要求找出每个顶点最早发生的时间。 6. **关键路径算法**`CriticalPath`在有向网中寻找关键活动,这些活动的延迟会影响项目的...
对于有向无环图(DAG),拓扑排序将顶点排成线性序列,使得对于每一条有向边 (u, v),顶点 u 都在顶点 v 之前。Kahn算法和DFS都可以实现拓扑排序。 6. **二分查找法在图论中的应用:** - Ford-Fulkerson算法:...
综上所述,用C语言实现无向图的算法时,需要掌握图的逻辑结构、存储结构(邻接矩阵和邻接表)、遍历算法(DFS和BFS)、最小生成树算法、最短路径算法以及拓扑排序等核心知识。在实际编程中,根据图的特性选择合适的...
4. **拓扑排序**:有向无环图(DAG)的顶点排序,使得对于每条边(u, v),u总是在v之前。 5. **强连通分量**:Tarjan算法或Kosaraju算法用于找出有向图的强连通分量。 在C++实现这些概念时,可以采用邻接矩阵或邻接表...
在无向图中,边是无方向的,而在有向图中,边是有方向的,称为弧。 无向完全图是任意两个顶点之间都存在边的图,边的数量为n×(n-1)/2。有向完全图则是每个顶点对之间都有两条方向相反的弧,边的数量为n×(n-1)。图...
拓扑排序是图论中的一个重要概念,它适用于有向无环图(DAG,Directed Acyclic Graph)。在这样的图中,拓扑排序能够为节点提供一种线性的顺序,使得对于任何有向边 `(u, v)`,节点 `u` 总是在节点 `v` 之前。这种...
2. **导游线路图的创建与输出**:景区分布图通常用图数据结构表示,这里采用邻接链表存储(带权无向图),以便快速访问和修改景点间的关系。邻接矩阵用于输出图的可视化表示,权值无穷大可以用32767来模拟。 3. **...
2. **拓扑排序**:对于有向无环图(DAG),可以进行拓扑排序,得到一个没有前驱的任务列表,这在某些调度场景下很有用。 3. **安全性检查**:根据资源分配矩阵和需求矩阵,检查是否存在一种安全序列,即从图中找到一个...
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 排序外部文件...