博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拓扑排序+最短路径(无环加权有向图最短路径算法)
阅读量:4215 次
发布时间:2019-05-26

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

特点:

       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
stack; static int n, m; static boolean hasCycle = false; static int[]dis; static int INF = 99999999; static ArrayList
[]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; }}

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

你可能感兴趣的文章
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>
C++ 字符串string操作
查看>>
MySQL必知必会 -- 了解SQL和MySQL
查看>>
MySQL必知必会 -- 数据检索
查看>>
MySQL必知必会 -- 排序检索数据 ORDER BY
查看>>
POJ 3087 解题报告
查看>>
POJ 2536 解题报告
查看>>
POJ 1154 解题报告
查看>>
POJ 1661 解题报告
查看>>
POJ 1101 解题报告
查看>>
ACM POJ catalogues[转载]
查看>>
C/C++文件操作[转载]
查看>>
常见的排序算法
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
KMP求前缀函数(next数组)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>