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
所谓”遍历”或“枚举”即是要逐一列出全部情况。其要点是要满足两个要求: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含权图最短路径;审判,不要错过枚举退款保证不会重复;国际象棋八皇后问题的更多相关文章
- 带权图的最短路径算法(Dijkstra)实现
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
- 图之单源Dijkstra算法、带负权值最短路径算法
1.图类基本组成 存储在邻接表中的基本项 /** * Represents an edge in the graph * */ class Edge implements Comparable< ...
- Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离
Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索. 把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于 ...
- Java数据结构——带权图
带权图的最小生成树--Prim算法和Kruskal算法 带权图的最短路径算法--Dijkstra算法 package graph; // path.java // demonstrates short ...
- Dijkstra求解单源最短路径
Dijkstra(迪杰斯特拉)单源最短路径算法 Dijkstra思想 Dijkstra是一种求单源最短路径的算法. Dijkstra仅仅适用于非负权图,但是时间复杂度十分优秀. Dijkstra算法主 ...
- 【数据结构与算法Python版学习笔记】图——最短路径问题、最小生成树
最短路径问题 概念 可以通过"traceroute"命令来跟踪信息传送的路径: traceroute www.lib.pku.edu.cn 可以将互联网路由器体系表示为一个带权边的 ...
- 无向带权图的最小生成树算法——Prim及Kruskal算法思路
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- C语言——无向带权图邻接矩阵的建立
#include <stdio.h> #include "Graph.h" #define MAX_INT 32767 /* #define vnum 20 #defi ...
- BZOJ3438:小M的作物 (最大闭合权图->最小割)
小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可以获得ai ...
随机推荐
- 安装使用jupyter(原来的notebook)
1.安装pyzmq 使用pip install pyzmq,安装不成功. 使用easy_install.exe pyzmq.成功安装. 2.安装tornado pip tornado 安装完尚不成功. ...
- [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 ...
- 应用层协议实现系列(三)——FTPserver之设计与实现
在实现了HTTPserver之后.本人打算再实现一个FTPserver. 因为FTP协议与HTTP一样都位于应用层,所以实现原理也类似. 在这里把实现的原理和源代码分享给大家. 首先须要明白的是FTP ...
- 一个自己主动依据xcode中的objective-c代码生成类关系图的神器
https://github.com/kimsungwhee/KSHObjcUML 安装方法: 1.下载项目 2.执行 3.会又一次开启一个新的xcode 4.选择一个项目,点击 Objc-UML 会 ...
- 提高编程能力的7条建议 分类: T_TALENT 2014-04-12 10:41 294人阅读 评论(0) 收藏
编程是非常酷的一件事情,但是在酷炫的背后它对很多人来说还是挺难的.很多人在学习编程之初就被困难击败了. 当你不熟悉编程的时候,你可能会觉得无从下手,并且不知道如何运用学到的知识.只要你通过了这一困难的 ...
- php中usort自定义排序如何使用
php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort — 使 ...
- USB 3.0规范中译本 第10章 集线器,主机下行口以及设备上行口规范
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章描述USB 3.0 集线器的体系结构要求.本章还描述主机下行口和集线器下行口之间功能性的不同之处,以及设 ...
- ArcEngine 图层标注 (根据字段、角度)
转自chanyinhelv原文 ArcEngine 图层标注 (根据字段.角度) 今天做了一个用AE来控制图层是否显示标注,以及已哪一个字段作为标注的字段,以哪一个字段作为标注的角度,现将代码写下来, ...
- [Angular Directive] Structure directive and <template>
The structure directive is just a sugar syntax of <template>. Such as: <div *ngIf="nam ...
- B/S系统的前台和后台数据转递机制探究
作者:朱金灿 来源:http://blog.csdn.net/clever101 说实话写这篇文章超出了我的能力范围之外(因为我并没有多少Web开发经验),我所期待的是能起一个抛砖引玉的作用--希望高 ...