zoukankan      html  css  js  c++  java
  • 代码判断判断给定的图是否是有向无环图

    时间紧张,先记一笔,后续优化与完善。

        代码和判断

        判断给定的图是不是是有向无环图,方法是应用拓扑排序,代码如下:

        

        每日一道理
    灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻。它是平凡的,外表华丽与否,那都是一样的,珍珠点缀,水晶加饰的灯它只能用以装饰,来满足人们的虚荣心,比起这,普普通通的日光灯是幸运的,因为它照明的本性没有改变,如同生活中的一部分人平平凡凡却实实在在。
    #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;
    }

    文章结束给大家分享下程序员的一些笑话语录: 程序员喝酒
      我偶尔采用“木马策略”、“交叉测试”,时间不长就开始“频繁分配释放资源”,“cache”也是免不了的了,
      不过我从不搞“轮巡”,也不会“捕获异常”,更不会“程序异常”,因为我有理性
    克制的。  

  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3076752.html
Copyright © 2011-2022 走看看