/*思想:利用拓扑排序来找图中的环,即离散数学中的w过程,每次找到一条入度为零的边将其以及其所关联的边删除,直到删除到环的时候再也进行不下去,此时将环中的任意一个元素开始深度优先遍历即可。
*/#include <iostream>
#include <queue>
using namespace std;template<class EdgeType>
class Edge
{
public:int start,end;//边的起始节点,终止节点EdgeType weight;//边的权重(应该可以定义为int)Edge(){start=0;end=0;weight=0;}Edge(int st,int en,int w){start=st;end=en;weight=w;}bool operator > (Edge oneEdge){if(weight>oneEdge.weight)return true;elsereturn false;}bool operator < (Edge oneEdge){if(weight<oneEdge.weight)return true;elsereturn false;}
};template<class EdgeType>
class Graph
{public:int vertexNum; //图中节点个数int edgeNum;   //图中边的个数int * Mark;    //标记某节点是否被访问Graph(int verNum){this->vertexNum=verNum;edgeNum=0;Mark=new int[vertexNum];for(int i=0;i<vertexNum;i++){Mark[i]=0; //都没有被访问过}}~Graph(){delete [] Mark;}//virtual Edge<EdgeType> FirstEdge(int oneVertex)=0;//virtual Edge<EdgeType> NextEdge(Edge<EdgeType> oneEdge)=0;int verticesNum(){return vertexNum;}int EdgesNum(){return edgeNum;}bool isEdge(Edge<EdgeType> oneEdge){if(oneEdge.end>=0 && oneEdge.start>=0 && oneEdge.weight>0 && oneEdge.start!=oneEdge.end)//判断条件还不清楚{return true;}else{return false;}}int startOfVertex(Edge<EdgeType> oneEdge){return oneEdge.start;}int endOfVertex(Edge<EdgeType> oneEdge){return oneEdge.end;}EdgeType weight(Edge<EdgeType> oneEdge) //返回oneEdge的权重{return oneEdge.weight;}//virtual void setEdge(int start,int end,int weight)=0;//virtual void deleteEdge(int start,int end)=0;
};template<class EdgeType>
class AdjGraph : public Graph<EdgeType >
{private:int ** matrix;public:AdjGraph(int verNum):Graph<EdgeType>(verNum){matrix =new int * [verNum];for(int i=0;i<verNum;i++){matrix[i]=new int [verNum];}for(int i=0;i<verNum;i++)for(int j=0;j<verNum;j++){matrix[i][j]=999;}}AdjGraph(int verNum,int **  a):Graph<EdgeType>(verNum){matrix =new int * [verNum];for(int i=0;i<verNum;i++){matrix[i]=new int [verNum];}for(int i=0;i<verNum;i++)for(int j=0;j<verNum;j++){matrix[i][j]=a[i][j];}}EdgeType getIJ(int i,int j){if(i<this->vertexNum && i>=0 && j<this->vertexNum && j>=0)return matrix[i][j];else{cout<<"邻接矩阵越界"<<endl;return 0;}}int EdgesNum(){int edgeNum=0;for(int i=0;i<this->vertexNum;i++){for(int j=0;j<this->vertexNum;j++)if(matrix[i][j]<999)edgeNum++;}this->edgeNum=edgeNum;return edgeNum;}void disp(){cout<<endl;cout<<"此图的领接矩阵为"<<endl;for(int i=0;i<this->vertexNum;i++){for(int j=0;j<this->vertexNum;j++){cout<<matrix[i][j]<<" ";}cout<<endl;}}~AdjGraph(){for(int i=0;i<this->vertexNum;i++){matrix[i]=new int [this->vertexNum];}delete [] matrix;}Edge<EdgeType> FirstEdge(int oneVer) //返回顶点的第一条边{Edge<EdgeType> tem;tem.start=oneVer;for(int i=0;i<this->vertexNum;i++){if(matrix[oneVer][i]<999){tem.end=i;tem.weight=matrix[oneVer][i];return tem;//break;}}tem.weight=-1;tem.end=tem.start=0;//cout<<"没有符合条件的边"<<endl;return tem;}Edge<EdgeType> NextEdge(Edge<EdgeType> oneEdge)//返回与oneEdg有相同起点的下一条边{Edge<EdgeType> tem;tem.start=oneEdge.start;for(int i=oneEdge.end+1;i<this->vertexNum;i++){if(matrix[oneEdge.start][i]<999){tem.end=i;tem.weight=matrix[oneEdge.start][i];return tem;}}tem.weight=-1;//cout<<"没有符合条件的边"<<endl;return tem;}void visit(int i){cout<<i<<" ";}//深度优先搜索void DFS(int i)//从i号节点开始深度优先搜索{this->Mark[i]=1;//cout<<"zhe次从这里开始深度遍历"<<i<<endl;visit(i);for(Edge<EdgeType> e=FirstEdge(i);this->isEdge(e);e=NextEdge(e)){if(this->Mark[e.end]==0){//cout<<"下次从这里开始深度遍历"<<e.end<<endl;DFS(e.end);}}}void DFSGraph()//对图进行深度优先搜索{for(int i=0;i<this->vertexNum;i++)this->Mark[i]=0;  //标记都未访问for(int i=0;i<this->vertexNum;i++){if(this->Mark[i]==0){DFS(i);}}}//广度优先搜索void BFS(int i)//从i号节点开始广度优先搜索{queue<int> que;que.push(i);visit(i);this->Mark[i]=1;int p;while(!que.empty()){p=que.front();que.pop();this->Mark[p]=1;for(Edge<EdgeType> e=FirstEdge(p);this->isEdge(e);e=NextEdge(e)){if(this->Mark[e.end]==0){//此处要注意,在节点入队时候就要将Mark置为已访问,否则可能会导致同一节点多次入队visit(e.end);this->Mark[e.end]=1;que.push(e.end);}}}}void BFSGraph()//对图进行广度优先搜索{for(int i=0;i<this->vertexNum;i++)this->Mark[i]=0;  //标记都未访问for(int i=0;i<this->vertexNum;i++){if(this->Mark[i]==0){BFS(i);}}cout<<endl;}};//拓扑排序,判断图中是否有环,并输出一个环
template<class EdgeType>
void TopuSortJudeIsExitCricle(AdjGraph<EdgeType>& G,int * SortArray)//从S出发生成最短路径
{int n=G.verticesNum();int * inderGree= new int [n];for(int i=0;i<n;i++){G.Mark[i]=0;inderGree[i]=0;SortArray[i]=-1;}for(int i=0;i<n;i++){for(Edge<EdgeType> e = G.FirstEdge(i);G.isEdge(e);e=G.NextEdge(e)){//cout<<"e的开头"<<e.start<<endl;//cout<<"e的结尾"<<e.end<<endl;inderGree[e.end]++;}}cout<<"inder数组"<<endl;for(int j=0;j<n;j++){cout<<inderGree[j]<<" ";}cout<<endl;for(int i=0;i<n;i++){int v;for(v=0;v<n;v++){if(inderGree[v]==0 && G.Mark[v]==0){cout<<"入度为零的点为"<<v<<endl;break;}}if(v==n){cout<<"图中存在环"<<endl;cout<<"此时的mark数组"<<endl;for(int j=0;j<n;j++){cout<<G.Mark[j]<<" ";}cout<<endl;for(int j=0;j<n;j++){if(G.Mark[j]==0){cout<<"环从这里开始"<<j<<endl;G.DFS(j);cout<<endl;return;}}}G.Mark[v]=1;SortArray[i]=v;for(Edge<EdgeType> e = G.FirstEdge(v);G.isEdge(e);e=G.NextEdge(e)){inderGree[e.end]--;}}delete [] inderGree;
}int main()
{//课本p170的图int tem[6][6]={{999,  1,  1,  1,  1,  1},{999,999,1  ,999,999,999},{999,999,999,999,1  ,999},{999,999,1  ,999,999,999},{999,999,999,1  ,999,999},{999,999,999,999,1  ,999},};int n=6;int ** a=new int *[n];for(int i=0;i<n;i++){a[i]=new int [n];}for(int i=0;i<n;i++)for(int j=0;j<n;j++){a[i][j]=tem[i][j];}AdjGraph<int> p(n,a);p.disp();cout<<"深度优先搜索"<<endl;p.DFSGraph();cout<<endl;cout<<"广度优先搜索"<<endl;p.BFSGraph();int sortArray[n];TopuSortJudeIsExitCricle(p,sortArray);cout<<"拓扑序列为"<<endl;for(int i=0;i<n;i++){if(sortArray[i]>0)cout<<sortArray[i]<<" ";}cout<<endl;return 0;
}

大连理工大学软件学院数据结构第四章第九题相关推荐

  1. 计算机科学计算第二版第四章,大连理工大学 计算机科学计算 第四章2.pdf

    大连理工大学 计算机科学计算 第四章2 第4章 插值与逼近 4.2.4 Hermite插 值 4.2.4 Hermite插值 理论和应用中提出的某些插值问题,要求插值函数p (x) 具有一定的光滑度, ...

  2. 大连理工大学c语言第三次上机作业答案,大连理工大学软件学院C语言上机第五六章课后题...

    大连理工大学软件学院C语言上机第五六章课后题 五.1. #includeint main() { int a,b,c; float X,Y,Z; scanf("%d%d%d",&a ...

  3. 【20保研】大连理工大学软件学院2019年优秀大学生学术夏令营通知

    点击文末的阅读原文或者公众号界面左下角的保研夏令营或者公众号回复"夏令营"是计算机/软件等专业的所有保研夏令营信息集合,会一直更新的. 一.院系与学科介绍  大连理工大学软件工程学 ...

  4. 太原理工大学软件学院数据库实验四(2021.4.26)

    太原理工大学软件学院数据库实验四(2021.4.26) -- (1)创建Student 表 CREATE TABLE Student ( Sno CHAR(8) PRIMARY KEY, Sname ...

  5. 第四章第九节数据资产盘点-数据资产目录分类

    第四章第九节数据资产盘点-数据资产目录分类 在形成数据资产清单以后,如何将清单进行分类?关于数据资产目录的分类,有几种方法,一是参考行业数据分类框架.二是参考监管数据分类.三是根据数据管理实践,结合企 ...

  6. 计算机网络 华南理工大学期末重点 第四章 网络层 谢希仁

    计算机网络 华南理工大学期末重点 第四章 网路层 <计算机网络(第七版)>谢希仁 前言 笔者是自动化专业,以下是大二上学期期末时,整理的一些复习笔记,既一些常考点,这是第四章<网络层 ...

  7. 大连理工大学软件学院编译技术课程——MicroC词法分析上机实验

    大连理工大学软件学院编译技术课程--MicroC词法分析上机实验 题目 编写词法分析编译程序 实验目的:对循环语句和条件判断语句编写词法分析编译程序,只能通过一遍扫描完成. 实验要求: (1) 关键字 ...

  8. 大连理工大学计算机考研调剂,2020年大连理工大学软件学院考研调剂公告

    考研调剂公告各院校已经发布出来了,下面由出国留学网小编为你精心准备了"2020年大连理工大学软件学院考研调剂公告",持续关注本站将可以持续获取更多的考试资讯! 2020年大连理工大 ...

  9. 大连理工计算机组成实验,大连理工大学软件学院计算机组成原理实验报告

    <大连理工大学软件学院计算机组成原理实验报告>由会员分享,可在线阅读,更多相关<大连理工大学软件学院计算机组成原理实验报告(57页珍藏版)>请在人人文库网上搜索. 1.大连理工 ...

最新文章

  1. C语言编程中的“堆”和“栈”七大不同之处
  2. mysql数据库连接过多的错误,可能的原因分析及解决办法
  3. windows 下 logstash 安装启动
  4. linux mq发送测试消息,WebSphere MQ测试常用指令
  5. livy提交任务报错com.cloudera.livy.shaded.kryo.kryo.KryoException: Unable to find class: GATest.ConJob
  6. 将视图转为image_使用视图绑定替代 findViewById
  7. 敏感词过滤算法:前缀树算法
  8. go var 一个整数_Go语言基础之基本数据类型
  9. linux储存文件格式,linux中的.local文件是什么类型的文件?
  10. 中国城市统计年鉴1985-2021中国城市年鉴面板数据(完美Excel版)
  11. jsp超市仓库管理系统myeclipse开发sqlserver数据库
  12. 新浪股票数据接口获取
  13. Topaz Adjust AI Mac
  14. matlab里怎么做能带结构图,用matlab画出石墨烯的能带关系图Homewo.PDF
  15. c:forEach--------------JSTL
  16. Web Vue VI
  17. JVM对象创建与内存分配机制学习总结
  18. 基于R语言的主成分和因子分析
  19. MySQL 的索引是如何工作的?10 分钟讲清楚!
  20. cortana android 地图,Here地图停止Windows系统 微软:我自己干

热门文章

  1. Citrix AppCenter 初始化设置指南
  2. WebDriver-鼠标、键盘操作
  3. java中try...catch处理异常
  4. Linux,不过是从头再来(一)
  5. imx6ul的otg转host功能
  6. 【武汉万象奥科】瑞芯微RK3568芯片
  7. 想进互联网大公司?那这些题你总得会吧?前端面试题2022及答案前端面试题2022及答案
  8. MFS分布式文件系统存储之文件的删除恢复
  9. 简智音科技:提高短视频播放量的实用方法!
  10. 作为项目经理如何和大客户沟通打交道