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”也是免不了的了,
      不过我从不搞“轮巡”,也不会“捕获异常”,更不会“程序异常”,因为我有理性
    克制的。  

  • 相关阅读:
    DAY56
    DAY55
    DAY54
    DAY53
    DAY52
    DAY51
    DAY50
    spark1.1.0部署standalone分布式集群
    Storm流分组介绍
    Storm拓扑的并行度(parallelism)介绍
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3076752.html
Copyright © 2011-2022 走看看