经典图算法Java代码实践:BFS,DFS以及几种最短路径算法
public class City
{
String name;
int id;
static int idCounter = 0;
public City(String name)
{
this.name=name;
id = idCounter++;
}
}
import java.util.ArrayList; public class Graph { public static void main(String[] args)
{
// TODO Auto-generated method stub
Map M = new Map(12);
City a = new City("a");
City b = new City("b");
City c = new City("c");
City d = new City("d");
City e = new City("e");
City f = new City("f");
City g = new City("g");
City h = new City("h");
City i = new City("i");
City j = new City("j");
City k = new City("k");
City l = new City("l"); M.createEdge(a,b,3);
M.createEdge(a,c,5);
M.createEdge(a,d,4); M.createEdge(b,f,6); M.createEdge(c,d,2);
M.createEdge(c,g,4); M.createEdge(d,e,1);
M.createEdge(d,h,5); M.createEdge(e,f,2);
M.createEdge(e,i,4); M.createEdge(f,j,5); M.createEdge(g,h,3);
M.createEdge(g,k,6); M.createEdge(h,i,6);
M.createEdge(h,k,7); M.createEdge(i,j,3);
M.createEdge(i,l,5); M.createEdge(j,l,9); M.createEdge(k,l,8); System.out.println("the graph is:\n");
System.out.println(M); System.out.println();
System.out.println("findPathByDFS:a to k");
M.findPathByDFS(a,k); System.out.println();
System.out.println("findPathByBFS:a to k");
M.findPathByBFS(a,k); System.out.println();
System.out.println("bellmanFord from a:");
M.bellmanFord(a); System.out.println();
System.out.println("dijkstra from a:");
M.dijkstra(a); System.out.println();
System.out.println("bellmanFord,print example from a:");
M.floydWarshall();
M.printFloydWarshallForOneCity(a);
} }
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue; public class Map
{
double[][] A;
public Map(int n)
{
A = new double[n][n];
for(int i = 0;i < A.length;i++)
{
for(int j = 0;j < A.length;j++)
{
if(i == j) A[i][j] = 0;
else A[i][j] = -1;
}
} }
ArrayList<City> cities = new ArrayList<City>(); private double[] D;
private void relax(int u,int v)
{
if(D[v]>D[u]+A[v][u])
D[v]=D[u]+A[v][u];
} private double[][] DD = null;
public void floydWarshall()
{
DD = new double[A.length][A.length];
int i,j,k;
for(i = 0;i < A.length;i++)
{
for(j = 0;j < A.length;j++)
{
if(A[i][j]>0)
DD[i][j] = A[i][j];
else if(i == j) DD[i][j] = 0;
else DD[i][j] = 99999999; }
}
for(k = 0;k < A.length;k++)
for(i = 0;i < A.length;i++)
for(j = 0;j < A.length;j++)
{
if(DD[i][j] > DD[i][k] + DD[k][j])
{
DD[i][j] = DD[i][k] + DD[k][j];
}
}
} public void printFloydWarshallForOneCity(City city)
{
System.out.println("floydWarshall:");
if(DD == null)
{
floydWarshall();
}
for(int i=0;i<A.length;i++)
{
System.out.printf("from %s to %s shortest path is:%f\n",city.name,cities.get(i).name,DD[city.id][i]);
} } public void dijkstra(City city)
{
dijkstra(city.id);
System.out.println("dijkstra:");
for(int i=0;i<A.length;i++)
{
System.out.printf("from %s to %s shortest path is:%f\n", city.name,cities.get(i).name,D[i]);
}
} public void dijkstra(int srcId)
{
D = new double[A.length];
for(int i=0;i<A.length;i++)
{
D[i]=999999999;
}
D[srcId]=0;
int[] q = new int[A.length];
int ql=0,qf=0; //队列 for(int i=0;i<A.length;i++) q[ql++]=i;
while(qf!=ql)
{
int min=qf;
for(int i=qf;i<ql;i++)
{
if(D[q[i]]<D[q[min]])
{
min=i;
}
}
int id = q[qf];
q[qf] = q[min];
q[min] = id; //q[qf] is the min
int u=q[qf++];
for(int i=0;i<A.length;i++)
{
if(A[u][i]>0)
{
relax(u,i);
}
}
}
} public void bellmanFord(City city)
{
bellmanFord(city.id);
System.out.println("bellmanFord:");
for(int i=0;i<A.length;i++)
{
System.out.printf("from %s to %s shortest path is:%f\n", city.name,cities.get(i).name,D[i]);
}
} public void bellmanFord(int srcId)
{
D = new double[A.length];
for(int i=0;i<A.length;i++)
{
D[i] = 99999999;//无穷大
}
D[srcId] = 0;
for(int i=0;i<A.length;i++)//外层循环次数
{
for(int j=0;j<A.length;j++)
{
for(int k=0;k<A.length;k++)
{
if(A[j][k]>0)
{
relax(j,k);
}
}
} }
} Queue<Integer> bfsQueue = new LinkedList<Integer>();
boolean[] bfsFlag;
int bsfPre[];
public void findPathByBFS(City src,City dst)
{
System.out.printf("bfs find path between '%s' and '%s'!\n",src.name,dst.name);
findPathByBFS( src.id, dst.id);
printBFS(dst.id); }
public void findPathByBFS(int srcId,int dstId)
{
bsfPre = new int[A.length];
bfsQueue.clear();
bfsFlag = new boolean[A.length];
for(int i=0;i<A.length;i++)
{
bfsFlag[i] = false;
bsfPre[i] = -1;
} bfsQueue.offer(srcId);
bfsFlag[srcId] = true; while(!bfsQueue.isEmpty())
{
int current = bfsQueue.poll();
for(int index=0;index<A.length;index++)
{
if(current == index) continue;
if(A[current][index]>0) //两者相连
{
if(index == dstId)//找到目标了
{
bfsFlag[index] = true;
bsfPre[index] = current;
return;//直接返回
}
if(bfsFlag[index] == false)//假设未訪问过
{
bfsFlag[index] = true;
bsfPre[index] = current;
bfsQueue.offer(index);
}
} }
} } private void printBFS(int dstId)
{
int index = dstId; do
{
System.out.printf("<-%s", cities.get(index).name);
index = bsfPre[index];
}while(index != -1);
System.out.println();
} ArrayList<Integer> dfsPath = new ArrayList<Integer>();
boolean[] dfsFlag;
private void printDFS()
{
for(Integer node:dfsPath)
{
System.out.printf("->%s", cities.get(node).name);
}
System.out.println();
}
public void findPathByDFS(City src,City dst)
{
System.out.printf("dfs find path between '%s' and '%s'!\n",src.name,dst.name);
findPathByDFS(src.id, dst.id);
}
public void findPathByDFS(int srcId,int dstId)
{
dfsPath.clear();
dfsFlag = new boolean[A.length];
for(int i=0;i<A.length;i++)
{
dfsFlag[i] = false;
}
dfsPath.add(srcId);
dfsFlag[srcId] = true;
dfs( srcId, dstId);
printDFS();
}
private void dfs(int srcId,int dstId)
{
for(int index=0;index<A[srcId].length;index++)
{
if(srcId == index) continue;
if(A[srcId][index]>0)//两者连接
{
if(index == dstId)//找到目标了
{
dfsFlag[index] = true;
dfsPath.add(index);
return;
}
if(dfsFlag[index] == false)//假设该节点未訪问过
{
dfsFlag[index] = true;
dfsPath.add(index);
dfs(index,dstId);
if(dfsFlag[dstId] == false)//目标没找到
dfsPath.remove(index);
else return;
} }
}
} public void createEdge(City a, City b, double w)
{
A[a.id][b.id]=w;
A[b.id][a.id]=w;//added by me!
cities.add(a.id,a);
cities.add(b.id,b);
} public String toString()
{
String r = "I am a map of " + A.length + " cities.";
r += " My connections are:\n";
for (int i=0;i<A.length;i++)
{
for (int j=0;j<A[0].length;j++)
r+=A[i][j]+"\t";
r+="\n";
}
return r;
}
}
经典图算法Java代码实践:BFS,DFS以及几种最短路径算法的更多相关文章
- [java代码库]-简易计算器(第二种)
[java代码库]-简易计算器(第二种) 第二种方案:在程序中不使用if/switch……case等语句,完成计算器功能. <html> <head> <title> ...
- python2.7 (x64) 调用 java 代码实践
背景:公司实施接口自动化测试,使用的框架python+unittest:因为开发使用的架构师SpringBoot,在测试过程中难免需要使用到python调用JAVA的一些接口,所以需要用到python ...
- 学习Java绝对要懂的,Java编程中最常用的几种排序算法!
今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来! ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...
- [改善Java代码]对字符串排序 持一种宽容的心态
在Java中一涉及到中文处理就会冒出很多的问题来,其中的排序也是一个让人头疼的问题,看代码: import java.util.Arrays; public class Client { public ...
- Java代码模拟http请求的两种方式
z这里用百度地图的逆地理编码接口为例, 第一种方式:(通过jdk中的java.net包) 引入工具类 import java.net.URL; import java.net.URLConnectio ...
- [java代码库]-简易计算器(第一种)
简易计算器(效果如图所示) 第一种方案:采用Javascript+html完成计算器,支持+-*/,结果显示不允许使用input输入域(可以考虑使用<span>) <html> ...
- 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》
终极版 v1.3.0 2017年开春之际,阿里诚意献上重磅大礼:<阿里巴巴Java开发手册>,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平, ...
- 阿里官方Java代码规范标准《阿里巴巴Java开发手册》下载
https://bbs.aliyun.com/read/306592.html?page=e 2017年开春之际,诚意献上重磅大礼:阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准. 这 ...
- Spring Boot 使用Java代码创建Bean并注册到Spring中
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...
随机推荐
- SPOJ BGSHOOT - Shoot and kill (线段树 区间修改 区间查询)
BGSHOOT - Shoot and kill no tags The problem is about Mr.BG who is a great hunter. Today he has gon ...
- [CTSC2017]密钥
传送门:http://uoj.ac/problem/297 “无论哪场比赛,都要相信题目是水的” 这不仅是HNOI2018D2T3的教训,也是这题的教训,思维定势真的很可怕. 普及组水题,真是愧对CT ...
- 【2-SAT】URAL - 2089 - Experienced coach
题意:给出n对点a,b 要求从没对点中选出一个,且最终选出的点n个数不能存在相同的.输入数据满足每种数最多出现3次,最少出现1次 思路:第i对点的编号2*i, 2*i+1, 因为每个数最多出现3 ...
- Scala高手实战****第19课:Scala的包、继承覆写及Spark源码鉴赏
1.SparkSession.scala //导入某个类 import scala.beans.Introspector //导入某包下所有的类 import scala.beans._ //导入某包 ...
- 获取OS X中App Store更新后的安装包(如XCode)
如果宿舍有好几个人需要更新一些大的软件,如XCode,会占用很大的带宽. 为了节省带宽,我们可以在1台电脑上更新完后,获取存放在系统暂存区的更新的安装包,然后通过局域网或Airdrop的方式轻松分 ...
- 再谈EditText只能输入金额
上次写了一篇EditText只能输入金额的博客,后来发现一个bug,当还未输入数字的情况下输入小数点程序就崩了,我去测了一下支付宝,看看会怎么样,我先输入小数点,程序正常,我再输入数字,可以正常输入, ...
- Java杂谈6——Java安全模型
Java语言安全模型是其有别于传统的编程语言的一个很重要的特点,采用一种沙箱模型隔离了Java的运行环境与具体的操作系统,使得Java在网络环境下能够更为安全的运行.理解Java的安全模型,能够帮助我 ...
- 【docker】查看docker容器或镜像的详细信息命令,查看docker中正在运行的容器的挂载位置
命令: docker inspect f257d69e0035 格式: docker inspect 容积或镜像ID 首先,docker ps获取简要信息 然后输入命令docker inspect ...
- 【spring data jpa】jpa中使用count计数方法
spring data jpa中使用count计数方法很简单 直接在dao层写方法即可 int countByUidAndTenementId(String parentUid, String ten ...
- 【js】判断浏览器是否IE浏览器
搜罗各种方法来判断浏览器是否为IE浏览器 1.最简单的[来自:http://www.cnblogs.com/heganlin/p/5889743.html] if(!+[1,]){ layer.msg ...