判断给定的图是不是有向无环图实例代码

 更新时间:2013年05月14日 14:43:18   作者:  
判断给定的图是不是是有向无环图,方法是应用拓扑排序,代码如下

复制代码 代码如下:

#include<iostream>
#include<list>
#include<stack>
using namespace std;

class Graph {
 int vertexNum;
 list<int> *adjacents;
public:
 Graph(int _vertexNum) {
  vertexNum = _vertexNum;
  adjacents = new list<int>[vertexNum];
 }
 void findIndegree(int *indegree, int n);
 bool topologicalSort();
 void addEdge(int v, int w);
};

void Graph::addEdge(int v, int w) {
 adjacents[v].push_back(w);
}

void Graph::findIndegree(int *indegree, int n) {
 int v;
 list<int>::iterator iter;
 for(v = 0; v < vertexNum; v++) {
  for (iter = adjacents[v].begin(); iter != adjacents[v].end(); iter++)
   indegree[*iter]++;
 }
}

bool Graph::topologicalSort() {
 int ver_count = 0;
 stack<int> m_stack;
 int *indegree = new int[vertexNum];
 memset(indegree, 0, sizeof(int) * vertexNum);
 findIndegree(indegree, vertexNum);
 int v;
 for (v = 0; v < vertexNum; v++)
  if (0 == indegree[v])
   m_stack.push(v);
 while (!m_stack.empty()) {
  v = m_stack.top();
  m_stack.pop();
  cout << v << " ";
  ver_count++;
  for (list<int>::iterator iter = adjacents[v].begin(); iter != adjacents[v].end(); iter++) {
   if (0 == --indegree[*iter])
    m_stack.push(*iter);
  }
 }
 cout << endl;
 if (ver_count < vertexNum)
  return false;
 return true;
}

int main(int argc, char *argv[]) {
 Graph g(6);
 g.addEdge(5, 2);
    g.addEdge(5, 0);
    g.addEdge(4, 0);
    g.addEdge(4, 1);
    g.addEdge(2, 3);
    g.addEdge(3, 1);
 if (g.topologicalSort())
  cout << "it is a topological graph" << endl;
 else
  cout << "it is not a topological graph" << endl;
 cin.get();
 return 0;
}

相关文章

  • C++STL之vector模板类详解

    C++STL之vector模板类详解

    这篇文章主要为大家详细介绍了C++vector模板类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C/C++ Qt Tree与Tab组件实现分页菜单功能

    C/C++ Qt Tree与Tab组件实现分页菜单功能

    这篇文章主要介绍了C/C++ Qt Tree与Tab组件实现分页菜单功能,实现一个类似于树形菜单栏的功能,当用户点击菜单栏中的选项时则会跳转到不同的页面上,本文简单给大家分享实现代码,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • 深入浅出理解C语言指针的综合应用

    深入浅出理解C语言指针的综合应用

    指针是指向另一个变量的变量。意思是一个指针保存的是另一个变量的内存地址。换句话说,指针保存的并不是普通意义上的数值,而是另一个变量的地址值。一个指针保存了另一个变量的地址值,就说这个指针“指向”了那个变量
    2022-02-02
  • C语言详细实现猜拳游戏流程

    C语言详细实现猜拳游戏流程

    在学习了循环、分支、和函数之后,可以写一些简单的小游戏来给自己的编程之路增添一份乐趣。不仅提升了编码能力,还可以边学边玩,简直妙哉妙哉
    2022-05-05
  • C/C++ 双链表之逆序的实例详解

    C/C++ 双链表之逆序的实例详解

    这篇文章主要介绍了C/C++ 双链表之逆序的实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • OpenCV计算图像的水平和垂直积分投影

    OpenCV计算图像的水平和垂直积分投影

    这篇文章主要为大家详细介绍了OpenCV计算图像的水平和垂直积分投影,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C++17 使用 std::string_view避免字符串拷贝优化程序性能

    C++17 使用 std::string_view避免字符串拷贝优化程序性能

    这篇文章主要介绍了C++17 使用 std::string_view避免字符串拷贝优化程序性能,帮助大家提高程序运行速度,感兴趣的朋友可以了解下
    2020-10-10
  • 关于移位操作的一点重要说明

    关于移位操作的一点重要说明

    下面小编就为大家带来一篇关于移位操作的一点重要说明。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 浅析C++中类模板的用法

    浅析C++中类模板的用法

    C++类模板是一种用于创建通用类的工具,它允许我们定义一个通用类,支持多种类型。本文就来简单讲讲它的具体使用吧,感兴趣的可以了解一下
    2023-04-04
  • C/C++中多重继承详解及其作用介绍

    C/C++中多重继承详解及其作用介绍

    这篇文章主要介绍了C/C++中多重继承详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论