求两节点的最短通路。对于无权图,能够通过图的广度优先遍历求解。含权图一般通过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

所谓”遍历”或“枚举”即是要逐一列出全部情况。其要点是要满足两个要求: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);

}

}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Dijkstra含权图最短路径;审判,不要错过枚举退款保证不会重复;国际象棋八皇后问题的更多相关文章

  1. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  2. 图之单源Dijkstra算法、带负权值最短路径算法

    1.图类基本组成 存储在邻接表中的基本项 /** * Represents an edge in the graph * */ class Edge implements Comparable< ...

  3. Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离

    Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索. 把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于 ...

  4. Java数据结构——带权图

    带权图的最小生成树--Prim算法和Kruskal算法 带权图的最短路径算法--Dijkstra算法 package graph; // path.java // demonstrates short ...

  5. Dijkstra求解单源最短路径

    Dijkstra(迪杰斯特拉)单源最短路径算法 Dijkstra思想 Dijkstra是一种求单源最短路径的算法. Dijkstra仅仅适用于非负权图,但是时间复杂度十分优秀. Dijkstra算法主 ...

  6. 【数据结构与算法Python版学习笔记】图——最短路径问题、最小生成树

    最短路径问题 概念 可以通过"traceroute"命令来跟踪信息传送的路径: traceroute www.lib.pku.edu.cn 可以将互联网路由器体系表示为一个带权边的 ...

  7. 无向带权图的最小生成树算法——Prim及Kruskal算法思路

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

  8. C语言——无向带权图邻接矩阵的建立

    #include <stdio.h> #include "Graph.h" #define MAX_INT 32767 /* #define vnum 20 #defi ...

  9. BZOJ3438:小M的作物 (最大闭合权图->最小割)

    小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可以获得ai ...

随机推荐

  1. 安装使用jupyter(原来的notebook)

    1.安装pyzmq 使用pip install pyzmq,安装不成功. 使用easy_install.exe pyzmq.成功安装. 2.安装tornado pip tornado 安装完尚不成功. ...

  2. [Docker] Run, Stop and Remove Docker Containers

    In this lesson, we'll find out the basics of running Docker containers. We'll go over how to downloa ...

  3. 应用层协议实现系列(三)——FTPserver之设计与实现

    在实现了HTTPserver之后.本人打算再实现一个FTPserver. 因为FTP协议与HTTP一样都位于应用层,所以实现原理也类似. 在这里把实现的原理和源代码分享给大家. 首先须要明白的是FTP ...

  4. 一个自己主动依据xcode中的objective-c代码生成类关系图的神器

    https://github.com/kimsungwhee/KSHObjcUML 安装方法: 1.下载项目 2.执行 3.会又一次开启一个新的xcode 4.选择一个项目,点击 Objc-UML 会 ...

  5. 提高编程能力的7条建议 分类: T_TALENT 2014-04-12 10:41 294人阅读 评论(0) 收藏

    编程是非常酷的一件事情,但是在酷炫的背后它对很多人来说还是挺难的.很多人在学习编程之初就被困难击败了. 当你不熟悉编程的时候,你可能会觉得无从下手,并且不知道如何运用学到的知识.只要你通过了这一困难的 ...

  6. php中usort自定义排序如何使用

    php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort — 使 ...

  7. USB 3.0规范中译本 第10章 集线器,主机下行口以及设备上行口规范

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章描述USB 3.0 集线器的体系结构要求.本章还描述主机下行口和集线器下行口之间功能性的不同之处,以及设 ...

  8. ArcEngine 图层标注 (根据字段、角度)

    转自chanyinhelv原文 ArcEngine 图层标注 (根据字段.角度) 今天做了一个用AE来控制图层是否显示标注,以及已哪一个字段作为标注的字段,以哪一个字段作为标注的角度,现将代码写下来, ...

  9. [Angular Directive] Structure directive and <template>

    The structure directive is just a sugar syntax of <template>. Such as: <div *ngIf="nam ...

  10. B/S系统的前台和后台数据转递机制探究

    作者:朱金灿 来源:http://blog.csdn.net/clever101 说实话写这篇文章超出了我的能力范围之外(因为我并没有多少Web开发经验),我所期待的是能起一个抛砖引玉的作用--希望高 ...