java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)
package dataStructure; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.io.*; class node {
int to, dist;
node(int t, int d) {
to = t;
dist = d;
}
} public class Graph { public static void dfs(ArrayList<ArrayList<node> > map, int v, boolean[] vis) {
vis[v] = true;
System.out.print(v + " "); ArrayList<node> rhs = map.get(v);
for(int i=; i<rhs.size(); ++i) {
int nv = rhs.get(i).to;
if(!vis[nv]) dfs(map, nv, vis);
}
} public static void bfs(ArrayList<ArrayList<node> > map, int v) {
boolean[] color = new boolean[map.size()];
LinkedList<Integer> Q = new LinkedList<Integer> (); color[v] = true;
Q.push(v);
int d = ;
System.out.print(v + "(" + d +") "); while(!Q.isEmpty()) {
int top = Q.peek();
Q.pop();
++d; for(node nc: map.get(top)) {
if(!color[nc.to]) {
color[nc.to] = true;
Q.push(nc.to);
System.out.print(nc.to + "(" + d +") ");
}
}
} } public static void caseInit(ArrayList<ArrayList<node> > map) {
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
addEdge(map, , , );
} public static void customize(ArrayList<ArrayList<node> > map) {
Scanner input = new Scanner(System.in);
while(true) {
int v = input.nextInt();
if(v == -) break; int w = input.nextInt(), d = input.nextInt();
addEdge(map, v, w, d);
}
input.close();
} public static void addEdge(ArrayList<ArrayList<node> > map, int from, int to, int dist) {
if(from < || from >= map.size() || to < || to >= map.size()) return; ArrayList<node> rhs = map.get(from);
rhs.add(new node(to, dist)); //ArrayList<node> rhs2 = map.get(to);
//rhs2.add(new node(from, dist));
} public static int[] dijkstra(ArrayList<ArrayList<node> > map, int v) {
int[] min_dis = new int[map.size()];
for(int i=; i<min_dis.length; ++i) min_dis[i] = Integer.MAX_VALUE;
for(int i=; i<map.get(v).size(); ++i) {
min_dis[map.get(v).get(i).to] = map.get(v).get(i).dist;
} boolean[] vis = new boolean[map.size()]; min_dis[v] = ;
vis[v] = true;
ArrayList<node> rhs = map.get(v); for(int i=; i<map.size(); ++i) { int Min = Integer.MAX_VALUE, Minj = v;
for(int j=; j<map.size(); ++j) {
if(!vis[j] && min_dis[j] < Min) {
Min = min_dis[j];
Minj = j;
}
} vis[Minj] = true;
ArrayList<node> tmp = map.get(Minj); for(int k=; k<tmp.size(); ++k) {
if(!vis[tmp.get(k).to] && min_dis[Minj] + tmp.get(k).dist < min_dis[tmp.get(k).to]) {
min_dis[tmp.get(k).to] = min_dis[Minj] + tmp.get(k).dist;
}
}
}
return min_dis;
} public static void topologicalSort(ArrayList<ArrayList<node> > map) {
int[] ind = new int[map.size()];
for(int i=; i<map.size(); ++i) {
for(node nc: map.get(i)) {
++ind[nc.to];
}
} LinkedList<Integer> Q = new LinkedList<Integer> ();
for(int i=; i<map.size(); ++i) {
if(ind[i] == ) {
Q.addLast(i);
//System.out.print(i + " ");
}
} while(!Q.isEmpty()) {
int top = Q.peek();
System.out.print(top + " ");
Q.poll();
for(node nc: map.get(top)) {
--ind[nc.to];
if(ind[nc.to] == ) Q.addLast(nc.to);
}
} }
public static void main(String[] args) {
ArrayList<ArrayList<node> > map = new ArrayList<ArrayList<node> > (); for(int i=; i<; ++i) {
ArrayList<node> row = new ArrayList<node> ();
map.add(row);
}
caseInit(map); int[] min_dis = dijkstra(map, );
//for(int i=0; i<min_dis.length; ++i) System.out.print(min_dis[i] + " "); //bfs(map, 0); topologicalSort(map);
} }
java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)的更多相关文章
- Java基础语法(8)-数组中的常见排序算法
title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...
- Java程序员必须掌握的8大排序算法
分类: 1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序) 所需辅助空间最多:归并排序所需辅助空间最少:堆 ...
- Java程序员必知的8大排序算法
8种排序之间的关系 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的.如 ...
- JAVA 基础编程练习题28 【程序 28 排序算法】
28 [程序 28 排序算法] 题目:对 10 个数进行排序 程序分析:可以利用选择法,即从后 9 个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即 用第二个元素与后 8 个进行比较,并进 ...
- 学习Java绝对要懂的,Java编程中最常用的几种排序算法!
今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来! ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...
- java利用自定义类型对树形数据类型进行排序
前言 为什么集合在存自定义类型时需要重写equals和hashCode? 1.先说List集合 List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了! 因为我 ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
- JAVA SE回顾及思考(3)——排序算法
排序的算法是很多公司的笔试和面试题,个人感觉Java中其实无需使用这些排序方法,因为Java中已经为我们提供了很方便效率很高的sort()方法.但是不使用不能代表不需要学习这些算法,也不是仅仅为了面试 ...
随机推荐
- POJ 2193 Lenny's Lucky Lotto Lists (DP)
题目链接 题意 : 给你两个数N和M,让你从1到M中找N个数组成一个序列,这个序列需要满足的条件是后一个数要大于前一个数的两倍,问这样的序列有多少,输出. 思路 : dp[i][j]代表着长度为 i ...
- PreparedStatement是如何大幅度提高性能的
本文讲述了如何正确的使用prepared statements.为什么它可以让你的应用程序运行的更快,和同样的让数据库操作变的更快. 为什么Prepared Statements非常重要?如何正确的 ...
- 孟岩的c++ 的学习方法,这何尝有不是做人做事的方法呢?
“(孟岩)我主张,在具备基础之后,学习任何新东西,都要抓住主线,突出重点.对 于关键理论的学习,要集中精力,速战速决.而旁枝末节和非本质性的知识内容,完全可 以留给实践去零敲碎打. “原因是这样的,任 ...
- 通过web代理进行跨域访问,http请求返回超时的问题定位
[现象] 在ajax通过web代理跨域访问时,http第一次登陆时正常,但是第二次再下发其他命令的时候总是返回 java.net.SocketTimeoutException: Read timed ...
- 使用头文件cfloat中的符号常量获知浮点类型数据的表数范围---gyy整理
使用头文件cfloat中的符号常量获知浮点类型数据的表数范围 cfloat头文件包含了系统的浮点数的长度限制 头文件climits中的符号常量是获知整型数据的表数范围,并不能获取浮点类型数据的表数范围 ...
- windows10 无法搜索本地应用的解决办法
博客好久没有更新了,今天拔下草,不多说,直接说如何解决吧.目前看到的比较靠谱的解决方案有4种,应该能解决绝大部分人的问题. 方法1和方法2 百度经验里面说的很清楚了,这里不再多说,大家可以直接参考:链 ...
- Eclipse环境下JBoss调试,解决引用的工程不被部署的问题
其实算是一个很小的经验,在eclipse环境下进行jboss的部署,因为要定义某公共包的问题,将代码down下来做了个工程,部署时发现jboss提示:class not found! 从jboss部署 ...
- MySQL索引的查看创建和删除
1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...
- Java [Leetcode 283]Move Zeroes
题目描述: Given an array nums, write a function to move all 0's to the end of it while maintaining the r ...
- 应用MVP模式写出可维护的优美Android应用
在Android开发中,我们常常会动辄写出数千行的Java类,而当一个Activity有4.5千行的时候,想找一个逻辑在哪儿就会显得异常痛苦了.比如想在数据加载错误的时候,显示一个提示信息,上上下下得 ...