Dijkstra求含权图最短通路;试探与回溯保证枚举的不遗漏不重复

求两节点的最短通路,对于无权图,可以通过图的广度优先遍历求解。含权图一般通过Dijkstra算法求解。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class Shortest {
static class Cell{
int node;//连接到哪个节点
int weight;//边的权值
public Cell(int node,int weight){
this.node=node;
this.weight=weight;
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List[] g=new List[11];
for(int i=0;i<g.length;i++)g[i]=new ArrayList();
//邻接表形式
g[0].add(new Cell(1,3));
g[0].add(new Cell(4,1));
g[1].add(new Cell(2,1));
g[1].add(new Cell(6,3));
g[1].add(new Cell(9,4));
g[1].add(new Cell(5,5));
g[1].add(new Cell(0,3));
g[2].add(new Cell(1,1));
g[2].add(new Cell(3,1));
g[2].add(new Cell(6,7));
g[3].add(new Cell(2,1));
g[3].add(new Cell(10,2));
g[4].add(new Cell(0,1));
g[4].add(new Cell(5,2));
g[5].add(new Cell(4,2));
g[5].add(new Cell(1,5));
g[5].add(new Cell(7,2));
g[5].add(new Cell(8,3));
g[6].add(new Cell(2,3));
g[6].add(new Cell(3,7));
g[6].add(new Cell(8,2));
g[6].add(new Cell(10,1));
g[7].add(new Cell(5,2));
g[8].add(new Cell(5,3));
g[8].add(new Cell(6,2));
g[9].add(new Cell(1,4));
g[9].add(new Cell(10,2));
g[10].add(new Cell(3,2));
g[10].add(new Cell(6,1));
g[10].add(new Cell(9,2));

//求0号节点开始的所有最小路径
Map map=new HashMap();
while(true){
int min=Integer.MAX_VALUE;//最小路径值
int min_no=-1;//对应节点号
//所有与0号节点相连接的且不在map中
for(int i=0;i<g[0].size();i++){
Cell t=(Cell)g[0].get(i);
if(map.get(t.node)==null&&t.weight<min){
min_no=t.node;
min=t.weight;
}
}
//与map中点邻接的,所有不在map中的节点(可能经历多个点的距离低于和直接相邻的点的距离)
Iterator  it=map.keySet().iterator();
while(it.hasNext()){
int k=(Integer)it.next();
int w=(Integer)map.get(k);//集合中的节点对应的最小路径值
for(int i=0;i<g[k].size();i++){
Cell t=(Cell)g[k].get(i);
if(map.get(t.node)==null&&t.weight+w<min){
min_no=t.node;
min=t.weight+w;
}
}
}
if(min<Integer.MAX_VALUE){
map.put(min_no,min);
}
else{
break;
}
}
System.out.print(map);
}
}

结果:{0=2, 1=3, 2=4, 3=5, 4=1, 5=3, 6=6, 7=5, 8=6, 9=7, 10=7}        0到本身的距离这里计算是按照到4,才从4回到0,所以等于2

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

所谓”遍历”或“枚举”即是要逐一列出所有情况。其要点是要满足两个要求:1不能重复;2不能遗漏。“不能重复”要求我们在遍历时要有章法,按照某种设计的路线来进行。试探与回溯是最为常用的、易于理解的设计思路。

八皇后问题有多个解

public class NoAttack {

/**
* 八皇后问题,这里不需要用8*8的棋盘,必须每个皇后不在同一行,横竖可以攻击 同时不可以在对角线的位置,攻击距离不限
*/

/**
* 检验新皇后放入后,是否冲突
*/
static boolean check(int[] a, int row, int col) {
for (int i = 0; i < row; i++) {
// 纵向上是否冲突
if (col == a[i])
return false;// 与先前皇后的列冲突
// 对角线检验
if (row - i == Math.abs(col - a[i]))
return false;
}
return true;
}

static void show(int[] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();

}
/**
* 对数组放置第K个皇后
*/
static void f(int[] a, int k) {
if (k == 8) {
show(a);
return;// 跳出递归

}
// 对8个位置逐一试探
for (int i = 0; i < 8; i++) {
a[k] = i;
// 将第k个皇后放在第i个位置,进行检查
if (check(a, k, i))
f(a, k + 1);
}
}

public static void main(String[] args) {
int[] a = new int[8];// 记录每行皇后的位置
f(a, 0);
}
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, int
, 短作业优先
, 路径最短
, node
, dijkstra
, import
, 求大神求解
, 求解释 求方法
, weight
, util
最短
长期限含权中期票据、含权债券、含权债、含权股、含权中期票据,以便于您获取更多的相关知识。

时间: 2024-10-02 06:06:02

Dijkstra求含权图最短通路;试探与回溯保证枚举的不遗漏不重复的相关文章

图论 数据结构-指定有向带权图中的任意几点,如何求出是否存在通路以及通路的最短路径?

问题描述 指定有向带权图中的任意几点,如何求出是否存在通路以及通路的最短路径? 指定有向带权图中的任意几点,如何求出是否存在通路以及通路的最短路径? 解决方案 虽然这是一个无向的,但是主要还是方法. 面对这个问题主要还是先解决起点(设为a)到其他点的最短通路,直到找到你所指定的一点(设为z) w(a,b)=4 w(a,d)=2 w(b,c)=3 w(d,e)=3 w(e.z)=1 w(c,z)=2 1.初始P={a},T={b,c,d,e,z} D(b)=4;D(c)=∞:D(d)=2;D(e)

用无向带权图实现校园导航系统

学校数据结构的课程实验之一. 用到的数据结构:无向带权图 用到的算法:Floyd最短路径算法,深度优先搜索(递归实现) 需求分析: 设计一个校园导航程序,为访客提供各种信息查询服务: 1. 以图中各顶点表示校内各单位地点,存放单位名称,代号,简介等信息:以边表示路径,存放路径长度等相关信息. 2. 图中任意单位地点相关信息的查询. 3. 图中任意单位的问路查询,即查询任意两个单位之间的一条最短的路径. 2. 从图中任意单位地点出发的一条深度优先遍历路径. 主函数: 1 #include <ios

使用dijkstra求最短路径,动态添加数据,无法求出最短路径

问题描述 使用dijkstra求最短路径,动态添加数据,无法求出最短路径 10C package Test; import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.PriorityQueue; import com.test.Station; public class DijSuccess { public static int

数据结构和算法10 之带权图

   上一节我们已经看到了图的边可以有方向,这一节里,我们将探讨边的另一个特性:权值.例如,如果带权图的顶点代表城市,边的权可能代表城市之间的距离,或者城市之间的路费,或者之间的车流量等等.     带权图归根究底还是图,上一节那些图的基本操作,例如广度优先搜索和深度优先搜索等都是一样的,在这一节里,我们主要来探讨一下带权图的最小生成树最短路径问题. 最小生成树问题     首先探讨下最小生成树问题,它与上一节所提到的最小生成树不同.上一节的最小生成树是个特例,即所有边的权值都一样.那么算法如何

img-平均值法求图像灰度图 运行够调试错误

问题描述 平均值法求图像灰度图 运行够调试错误 double *original_gray(double *R_original_img, double *G_original_img, double *B_original_img) { unsigned long height = 0; unsigned long width = 0; height = srcBI.biHeight; width = srcBI.biWidth; unsigned long h_B = 0; unsigned

C++数据结构中有向带权图的子邻接域图的算法怎么实现?是C++的,谢谢

问题描述 C++数据结构中有向带权图的子邻接域图的算法怎么实现?是C++的,谢谢 C++数据结构中有向带权图的子邻接域图的算法怎么实现?是C++的,谢谢 解决方案 http://wenku.baidu.com/link?url=X3yvE5Vll4s8xwO8u0ZikzG73nkjdnGIeCMTj9JmUgoCuM2kRtkKKnLL-tVcZBqcD9Yaq-oeVzoJl0Ru0zkV4W7WOrgC_s3I0z0PodcnDWy

热点转换频繁追逐高送转含权股投资机会

在历经题材股与权重股的热点转换后,市场步入胶着状态,年报期间曾备受关注的高送转股行情能否再次成为热点?为此,我们对年报10送转5股以上或10派5元以上已实施分红公司进行统计.数据显示,82家公司中,除权前5日跑赢上证指数的个股共57只,占比达七成,出现较为明显的抢权行情,其中,部分小盘股除权后继续演绎填权行情. 目前正处于年报分红实施密集期,送转或派现比例大于10:5的高送转含权股尚有57只,其中,流通A股低于1亿股的小盘股有21只.业绩方面,这些含权股中26家公司2008年净利润和2009年一

【算法小总结】迪杰斯特拉(Dijkstra)求最短路径

此图是有向无负权指的图(弱连通图)   假设求1到6的最短路径,用迪杰斯特拉(Dijkstra)算法如何求?   迪杰斯特拉算法像无权最短路径算法一样,按阶段进行.假设s是起点,在每个阶段,迪杰斯特拉算法选择离s最近的一个顶点v,在v所有未知顶点中选取它能达到的,距离它最短的x顶点的路径长度D,若D小于s到x的长度(若没有路就是无穷大),替换s到x的长度D',同时声明s到v的最短路径是已知的.   其实核心算法就是一个使用贪心选取法则填表的for循环 若是路径带价值,加上价值即可,在判断的时候当

求含raid卡驱动的PE工具

问题描述 公司主要是用到惠普和戴尔的服务器,为方便以后出了事故拷贝数据,求一款含着两款服务器的raid卡驱动的PE工具,求推荐