美团2017春招-算法工程师笔试-在线编程-判断有向图有回路
2017-03-21 20:40
288 查看
假设有向图采用邻接表存储,设计一个算法,判定
请概要说明你的算法思想。编写你的算法,请在算法关键的地方给出必要的注释。
分析该算法的时间复杂度。
解答:
思路-用拓扑排序的方法来检查是否存在回路,具体步骤如下:
选择一个入度为 0 的未被访问的顶点
若找到,继续第(2)
若没找到,则图中有环,算法结束
将该顶点标记为已访问,并将其所有出边所指向的顶点的入度减一
回到第一步继续执行
伪代码如下
bool HasCirclePath( Graph &G) { for (int i=0; i<G.VerticesNum(); i++) //初始化 Mark 数组 G.Mark[i]=0; using std::stack; Stack<int> S; for(i=0;i<G.VerticesNum();i++){ if(!G.Indegree[i]) //度数为零的顶点入栈 S.push(i); } int count = 0; //已访问过的顶点数,排序开始前为 0 while( !S.empty() ) { //如果栈中还有图的顶点 int V = S.top(); S.pop(); count++; //已访问过的顶点数加一 G.Mark[V] = 1; for( Edge e = G.FirstEdge(V); G.IsEdge(e); e= G.NextEdge(e) ){ //所有与之相邻的顶点入度减一 G.Indegree[G.ToVertex(e)]--;//边 e 的终点的入度值减一 if(!G.Indegree[G.toVertex(e)]) S.push(G.toVertex(e));//入度为零的点入栈 } } //若已访问的顶点个数小于图的顶点个数则为有环图,否则无环 return ( count<G.VerticesNum() ); }
(3)O(2|V|+|E|) 其中 V 为图的顶点数,E 为图的边数
相关文章推荐
- 在linux编程中,以下哪个TCP的套接字选项与nagle算法的开启和关闭有关?----腾讯2016研发工程师在线模拟笔试题
- [置顶] 阿里2017年-图形图像算法工程师-在线编程题目
- 阿里在线笔试算法工程师附加题
- 百度2014校园招聘笔试题 ——深度学习算法研发工程师.
- 百度笔试——计算机视觉算法研发工程师
- 珠海某外企在线C++笔试题(算法)二面
- C/C++笔试题-主要考察C/C++语言基础概念、算法及编程,附参考答案,分享给大家
- 百度笔试算法第二题:如何判断两个单向链表是否有相交,并找出交点
- 判断两个链表是否相交(在线编程测试平台www.anycodex.com)
- 百度2014校园招聘笔试题 ——深度学习算法研发工程师.
- 2012年阿里巴巴笔试 西安站 研发/算法工程师
- 第二次编程作业:判断一个正整数是否为质数的算法和 随机生成一个n bit位的长整数
- 每天学习一算法系列(8) (编程判断俩个链表是否相交)
- 百度2014校园招聘笔试题 ——深度学习算法研发工程师.
- C/C++笔试题-主要考察C/C++语言基础概念、算法及编程,附参考答案,分享给大家。
- 20131013百度北京深度学习算法研发工程师笔试题
- java方向笔试题2- 算法与编程
- 算法-微软亚院之编程判断俩个链表是否相交
- 阿里巴巴 算法、数据工程师笔试题选解
- 在线编程挑战赛第一名:我是这么学算法的