拓扑排序+最短路径(无环加权有向图最短路径算法)
来源:互联网 发布:淘宝服务商入驻条件 编辑:程序博客网 时间:2024/05/19 19:15
特点:
1、线性时间内解决单点最短路径问题
2、能够处理负权边问题
3、能够找出最长路径
不足:因为是基于拓扑排序的,所以不能解决带环的问题
import java.util.ArrayList;import java.util.Scanner;import java.util.Stack;import Graph.HasCycle;public class TopDij {static boolean[]visit;static boolean[]onStack;static Stack<Integer> stack;static int n, m;static boolean hasCycle = false;static int[]dis;static int INF = 99999999;static ArrayList<EdgeS> []adj;public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();m = in.nextInt();visit = new boolean[n+1];adj = new ArrayList[n+1];stack = new Stack<>();dis = new int[n+1];onStack = new boolean[n+1];for(int i = 1; i <= n; i++ ) {adj[i] = new ArrayList<>();}for(int i = 0; i < m; i++ ) {int from = in.nextInt();int to = in.nextInt();int w = in.nextInt();adj[from].add(new EdgeS(from, to, w));}bfs(1);//while(!stack.isEmpty()) {//System.out.println(stack.pop() + " ");//}if(!hasCycle) {shortPath(1);for(int i = 1; i <= n; i++ ) {System.out.println(dis[i] + " ");}}else {System.out.println("hasCycle");}}public static void shortPath(int s) {for(int i = 1; i <= n; i++ ) {dis[i] = 99999999;}dis[s] = 0;while(!stack.isEmpty()) {int cur = stack.pop();for(EdgeS e: adj[cur]) {if(dis[e.to] > dis[cur] + e.w) {dis[e.to] = dis[cur] + e.w;}}}}public static void bfs(int cur) {// 进行拓扑排序的同时检查是否含有环 有环的话就退出visit[cur] = true;onStack[cur] = true;for(EdgeS e:adj[cur]) {if(!visit[e.to]) {bfs(e.to);}else if(onStack[e.to]){hasCycle = true;return;}}onStack[cur] = false;stack.push(cur);//记录拓扑排序结果 、逆后序}}class EdgeS{int from, to, w;public EdgeS(int f, int t, int w) {from = f;to = t;this.w = w;}}
阅读全文
0 0
- 拓扑排序+最短路径(无环加权有向图最短路径算法)
- 有向加权图的最短路径算法-Dijkstra
- 有向加权图的最短路径算法-Prim
- Dijkstra最短路径算法(针对加权有向图)
- Java邻接表表示加权有向图,附dijkstra最短路径算法
- 《数据结构实战》-------------------------------------------图论 无加权最短路径算法
- 5.五环加权有向图-最短路径问题
- 有向图的最短路径(Floyd算法)
- SparkGraphX加权最短路径算法实现
- SparkGraphX加权最短路径算法实现
- SparkGraphX加权最短路径算法实现
- 算法8-10:最短路径算法之拓扑排序
- 图(有向图,无向图)的邻接矩阵表示C++实现(遍历,拓扑排序,最短路径,最小生成树) Implement of digraph and undigraph using adjacency matrix
- 图的遍历、拓扑排序、最短路径算法
- 图的遍历、拓扑排序、最短路径算法
- 无向图的最短路径算法(队列实现 )
- 无向网图的最短路径--Dijkstra算法
- 无向网图的最短路径--Floyd算法
- 解决欢迎页白屏问题
- 快速幂
- Qt获取本机网络信
- 分治法、动态规划和贪心算法
- 优达(Udacity)波士顿预测房价
- 拓扑排序+最短路径(无环加权有向图最短路径算法)
- 解决win10 VC++6.0 应用程序无法正常运行 0xc0000142
- Opencv中Mat矩阵乘法——点乘、dot、mul运算详解
- 图像简史
- Foo bar 什么鬼?
- Java POI生成一个指定模板的.xlsx文件
- [BZOJ]4991: [Usaco2017 Feb]Why Did the Cow Cross the Road III CDQ分治+树状数组
- 高斯滤波原理及实现
- [LC]657. Judge Route Circle