博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断有向图图是否有环
阅读量:4215 次
发布时间:2019-05-26

本文共 1462 字,大约阅读时间需要 4 分钟。

package Graph;import java.util.ArrayList;import java.util.LinkedList;import java.util.Scanner;import java.util.Stack;public class DirectedCycle {	int v, e;	boolean []visit;	boolean []onStack;	int []path;	boolean hasCycle = false;	int s;	Stack
stack; LinkedList
[]adj; public static void main(String[] args) { new DirectedCycle().run(); } public void run() { Scanner in = new Scanner(System.in); v = in.nextInt(); e = in.nextInt(); visit = new boolean[v+1]; onStack = new boolean[v+1]; adj = new LinkedList[v+1]; path = new int[v]; stack = new Stack<>(); for(int i = 0; i < v; i++ ) { adj[i] = new LinkedList<>(); } for(int i = 0; i < e; i++ ) { int a = in.nextInt(); int b = in.nextInt(); adj[a].offer(b); } for(int i = 0; i < v; i++ ) { if(!visit[i]) dfs(i); } if(hasCycle) printPath(); else { System.out.println("No cycle!"); } } public void printPath() { boolean flag = true; while(!stack.isEmpty()) { if(flag) { System.out.print(stack.pop()); flag = false; } else System.out.print("-" + stack.pop()); } } public void dfs(int cur) { visit[cur] = true; onStack[cur] = true; for(int w :adj[cur]) { if(!visit[w]) { path[w] = cur; dfs(w); } else if(onStack[w]) { hasCycle = true; stack.push(cur);//把结束点多入栈一次标记结束位置以区别与其他环 for(int x = cur; x != w; x = path[x])//结束点为当前第一个出现的已标记并且在栈内的点 stack.push(x); stack.push(w); return; } } onStack[cur] = false; } }

转载地址:http://dlimi.baihongyu.com/

你可能感兴趣的文章
POJ 1661 解题报告
查看>>
POJ 1101 解题报告
查看>>
ACM POJ catalogues[转载]
查看>>
C/C++文件操作[转载]
查看>>
常见的排序算法
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
KMP求前缀函数(next数组)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
DRM in Android
查看>>
ARC MRC 变换
查看>>
Swift cell的自适应高度
查看>>
【linux】.fuse_hiddenXXXX 文件是如何生成的?
查看>>
【LKM】整合多个LKM为1个
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>