`
datoplay
  • 浏览: 1614281 次
文章分类
社区版块
存档分类
最新评论

有向无回路图拓扑排序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++开源算法库OpenSAL1.1(Open Standardized Algorithm Library)——动态链接库

    图论算法(兼容有向图,无向图):广度和深度优先遍历、确定图是否存在回路、拓扑排序、强连通分支、欧拉环(欧拉路径)、最小生成树(Kruskal、Prim)、单源最短路径(3种)、每对顶点间最短路径(2种)、最大流(2...

    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 排序外部文件...

    数据结构图实验报告.doc

    "一、实验目的和要求 " "(1)掌握图的相关概念,包括图,有向图,无向图,完全图,子图,连通图,度,入 " "度,出度,简单回路和环等定义。 " "(2)重点掌握图的各种存储结构,包括邻接矩阵和邻接表等。 " "(3)...

    C C++算法实例.c

    4.无向图的连通分量 A.深度优先 B 宽度优先(种子染色法) 5.关键路径 6.拓扑排序 7.回路问题 9.判断图中是否有负权回路 Bellman-ford 算法 10.第n最短路径问题 三、背包问题 1.0-1背包: 每个背包只能...

    C++开源算法库OpenSAL1.1(Open Standardized Algorithm Library) ——静态链接库

    图论算法(兼容有向图,无向图):广度和深度优先遍历、确定图是否存在回路、拓扑排序、强连通分支、欧拉环(欧拉路径)、最小生成树(Kruskal、Prim)、单源最短路径(3种)、每对顶点间最短路径(2种)、最大流(2...

    c++算法实例的介绍方法

    c++的一些 算法实例介绍如 B.Kruskal算法:(贪心) ...6.拓扑排序 找入度为0的点,删去与其相连的所有边,不断重复这一过程。 例 寻找一数列,其中任意连续p项之和为正,任意q 项之和为负,若不存在则输出NO. 等等

    数据结构(C++)有关练习题

    4、用邻接矩阵或邻接图实现一个有向图的存储,并实现单源最短路径算法的实现(这个类的一个成员函数),并能输出该图的关键路径。 注:1、要用面向对象的方法设计代码; 2、一个图是一个类的实例; 3、类...

    OpenSAL1.1算法导论开源算法库

    图论算法(兼容有向图,无向图):广度和深度优先遍历、确定图是否存在回路、拓扑排序、强连通分支、欧拉环(欧拉路径)、最小生成树(Kruskal、Prim)、单源最短路径(3种)、每对顶点间最短路径(2种)、最大流...

    数据结构与算法分析

     9.6.4 有向图   9.6.5 查找强分支   9.7 NP完全性介绍   9.7.1 难与易   9.7.2 NP类   9.7.3 NP完全问题   小结   练习   参考文献  第10章 算法设计技巧   10.1 贪心算法 ...

    数据结构与算法分析C描述第三版

     9.6.4 有向图   9.6.5 查找强分支   9.7 NP完全性介绍   9.7.1 难与易   9.7.2 NP类   9.7.3 NP完全问题   小结   练习   参考文献  第10章 算法设计技巧   10.1 贪心算法   10.1.1...

    178个与算法有关的C语言

    若不形成回路则将此边加入最小生成树、计算图的传递闭包、无向图的连通分量、拓扑排序,找入度为0的点,删去与其相连的所有边,不断重复这一过程,例寻找一数列,其中任意连续p项之和为正,任意q 项之和为负,若不...

    Data-Structure:《数据结构与算法分析》上的代码实现

    -拓扑排序(Versioni 1,2) -单源最短路径算法 -最大网络流 -最小生成树 -深度优先搜索 -双连通性 -欧拉回路 ###第十章 -分治算法:最近点问题 -动态规划:斐波那契数列,递归关系,矩阵乘法顺序,最优搜索二叉树 -随

    leetcode全ac-how-to-grokking-leetcode-hard:这个是个中文博客,讲述一些leetcodehard的思维和

    拓扑排序) 搜索高级, 包括( A*, 迭代加深,IDA*, 双端队列广搜,双向DFS) 字符串高级,包括(KMP,后缀树,AC自动机,后缀数组) 数据结构高级,包括(红黑树,B+树,线段树,区间树,树状数组,splay, treap, 并查集...

    算法导论(part1)

    书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...

    算法导论(part2)

    书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...

Global site tag (gtag.js) - Google Analytics