代码判断判断给定的图是否是有向无环图

本文探讨了程序员在日常工作中运用逻辑思维解决技术难题,并通过一系列笑话语录展现了程序员面对挑战时的乐观态度与智慧。从拓扑排序算法的实现到幽默的编程生活片段,本文不仅介绍了关键的算法概念,还分享了程序员特有的文化与幽默感。
摘要由CSDN通过智能技术生成

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

    代码和判断

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

    

    每日一道理
灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻。它是平凡的,外表华丽与否,那都是一样的,珍珠点缀,水晶加饰的灯它只能用以装饰,来满足人们的虚荣心,比起这,普普通通的日光灯是幸运的,因为它照明的本性没有改变,如同生活中的一部分人平平凡凡却实实在在。
#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”也是免不了的了,
  不过我从不搞“轮巡”,也不会“捕获异常”,更不会“程序异常”,因为我有理性
克制的。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值