拓扑排序(判断有向图是否有回路)

2024-04-29 17:48

本文主要是介绍拓扑排序(判断有向图是否有回路),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <iostream>  
#include <queue>  
#include <string>  
using namespace std;  //表结点  
typedef struct ArcNode{  int adjvex;//该弧所指向的顶点的位置   ArcNode *nextarc;  
}ArcNode;  //头结点  
typedef struct VNode{  string data;//顶点信息  ArcNode *firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针  
}VNode, AdjList[10];  typedef struct ALGraph{  AdjList vertices;  int vexnum, arcnum;  
}ALGraph;  int LocateVex(ALGraph G, string u)//返回顶点u在图中的位置  
{  for(int i=0; i<G.vexnum; i++)  if(G.vertices[i].data==u)  return i;  return -1;  
}  void CreateDG(ALGraph &G)//构造有向图  
{  string v1, v2;  int i, j, k;  cout<<"请输入顶点数和边数:";  cin>>G.vexnum>>G.arcnum;  cout<<"请输入顶点:";  for(i=0; i<G.vexnum; i++)  {  cin>>G.vertices[i].data;  G.vertices[i].firstarc=NULL;  }  cout<<"请输入边:"<<endl;  for(k=0; k<G.arcnum; k++)  {  cin>>v1>>v2;  i=LocateVex(G, v1);  j=LocateVex(G, v2);  ArcNode* arc=new ArcNode;  arc->adjvex=j;  arc->nextarc=G.vertices[i].firstarc;  G.vertices[i].firstarc=arc;  }  
}  void FindIndegree(ALGraph G, int indegree[])//求顶点的入度  
{  for(int i=0; i<G.vexnum; i++)  indegree[i]=0;  for(i=0; i<G.vexnum; i++)  {  ArcNode *p=G.vertices[i].firstarc;  while(p)  {  indegree[p->adjvex]++;  p=p->nextarc;  }  }  
}  void TopologicalSort(ALGraph G)//拓扑排序  
{  queue<int> q;  int indegree[10]={0};//入度数组  int count=0;//计数,计入队数  FindIndegree(G, indegree);  for(int i=0; i<G.vexnum; i++)//入度为0的顶点入队  if(0==indegree[i])  q.push(i);  while(!q.empty())  {  int v=q.front();  q.pop();  count++;  cout<<G.vertices[v].data<<" ";  ArcNode *p=G.vertices[v].firstarc;  while(p)//出队后,每个邻接点入度减1  {  if(!(--indegree[p->adjvex]))  q.push(p->adjvex);//入度为0的顶点入队  p=p->nextarc;  }  }  if(count<G.vexnum)//由此判断有向图是否有回路  cout<<"该有向图有回路"<<endl;  
}  void main()  
{  ALGraph G;  CreateDG(G);  cout<<"拓扑排序:";  TopologicalSort(G);  cout<<endl;  }  

测试用例一:

 

 

测试用例二:


这篇关于拓扑排序(判断有向图是否有回路)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946745

相关文章

排序算法 下

1.快速排序 快速排序是Hoare在1962年提出的一种二叉树结构的交换排序的方法,采用了递归的思想 思想:任取待排序的元素序列中的某元素作为基准值,按照原来的顺序将序列分为两个子序列, 左子序列中的所有元素均小于基准直,右子树的所有序列中的元素均大于基准直,然后左右子序列重复该过程,直到所有元素都排在相应的位置上。 先写出大致的框架,与二叉树的前序遍历非常之像,写递归框架可以照着二叉树前

JDBC编程中,结果集为空的判断方法

JDBC编程中,常常会通过ResultSet rs来获得结果集,判断结果集是否为空往往不能直接判断rs == null, 所以一个经常使用的方法如下 try{ conn = DB.getConn(); String sql = "Select count(*) from category where pid = " + id; rs = DB.executeQury(conn

java List 排序问题

鄙人大概想了三种方式: 1.第一种:借助工具类 Collections  import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class TestSet {public static void main(Stri

答题套路2 阅读理解 说明文某个词是否能去掉

观点 回答:不能 解词 某个词什么意思需要解释一下 反证法 如果去掉了,会怎么样 总结 使用这个词体现了说明文的科学性,严谨性

MapReduce | 二次排序

1.需求 主播数据--按照观众人数降序排序,如果观众人数相同,按照直播时长降序 # 案例数据 用户id 观众人数 直播时长 团团 300 1000 小黑 200 2000 哦吼 400 7000 卢本伟 100 6000 八戒 250 5000 悟空 100 4000 唐僧 100 3000 # 期望结果 哦吼 400 7000 团团 300 1000 八戒 250 50

数据结构之排序(上)

片头 嗨,小伙伴们,大家好!我们今天来学习数据结构之排序(上),今天我们先讲一讲3个排序,分别是直接插入排序、冒泡排序以及希尔排序。 1. 排序的概念及其应用 1.1 排序的概念 排序:什么是排序呢?排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持

全国院校及梯度排序深度解析课(免费下载-帮助更多高考生做出人生重要的选择。)

"全国院校及梯度排序深度解析课"旨在深入探讨全国院校的排名及梯度排序原理。通过系统解析各院校的学术声誉、师资力量、科研水平等因素,帮助学员全面了解院校排名的背后逻辑,为选择合适院校提供理论支持。 课程大小:7G 课程下载:https://download.csdn.net/download/m0_66047725/89299927 更多资源下载:关注我。

mysql分页排序的坑,千万注意!

1、问题复现 现象: mysql对无索引字段进行排序后limit ,当被排序字段有相同值时并且在limit范围内,取的值并不是正常排序后的值,有可能第一页查询的记录,重复出现在第二页的查询记录中,而且第二页的查询结果乱序,导致分页结果查询错乱问题。 举个例子,假设有一张名为"users"的表,包含以下字段:id、name、age,以及要按照age字段进行升序排序进行分页查询的需求。 SELE

PHP判断并处理被urlencode过的字符串

问题描述: 给你一个字符串如何判断是被urlencode过的字符串,如果是则解码,输出编码前的内容。 举例: $content_1="这是一段汉字文本";$content_2="%E8%BF%99%E6%98%AF%E4%B8%80%E6%AE%B5%E8%A2%ABurlencode%E8%BF%87%E7%9A%84%E6%96%87%E5%AD%97%E3%80%82"; 如

数据结构java语言的各种排序

数据结构排序 下面是作者自己在学习Java语言时做的一些基础练习的排序,在此和大家分享:              将包含几种基本的排序方法的算法(先写两做最常用的排序,后续将更新更多的排序方式,有什么需要的请留言):冒泡排序,选择排序;                      冒泡排序: <span style="background-color: rgb(255, 255, 102)