1.带权图:要引入带权图,首先要引入最小生成树,当所有的边拥有相同的权值时。问题变得简单了,算法可以选择任意一条边加入最小生成树。但是当边有不同的权值时,需要用一些算法决策来选择正确的边。

2.带权图构建最小生成树算法:

  2.1.从一个顶点开始,把它放入树的集合中,然后重复做下面的事情:

    2.1.1.找到从最新的顶点到其他顶点的所有边,这些顶点不能在树的集合中,把这些边放入优先级队列,

    2.1.2.找出权值最小的边,把它和它所到达的顶点放入树的集合中。重复直到所有顶点都在树的集合中。

3.实现代码:

  3.1.Edge.java

 package com.cn.powergraph;
/**
* 带权图的边类
* @author Administrator
*
*/
public class Edge {
public int srcVert;
public int destVert;
public int distance;
public Edge(int sv,int dv,int d){
srcVert = sv;
destVert = dv;
distance = d;
}
}

  3.2.PriorityQ.java

 package com.cn.powergraph;
/**
* 优先级队列来实现带权图
* @author Administrator
*
*/
public class PriorityQ {
private final int SIZE = 20;
private Edge[] queArray;
private int size;
public PriorityQ(){
queArray = new Edge[SIZE];
size = 0;
}
public void insert(Edge item){
int i;
for ( i = 0; i < size; i++) {
if (item.distance >= queArray[i].distance)
break;
}
for (int j = size - 1; j >= i; j --) {
queArray[j + 1] = queArray[j];
}
queArray[i] = item;
size ++;
}
public Edge removeMin(){
return queArray[-- size];
}
public void removeN(int n){
for (int i = n; i < size - 1; i++) {
queArray[i] = queArray[i + 1];
}
size --;
}
public Edge peekMin(){
return queArray[size - 1];
}
public int size(){
return size;
}
public boolean isEmpty(){
return size == 0;
}
public Edge peekN(int n){
return queArray[n];
}
public int find(int index){
for (int i = 0; i < size; i++) {
if (queArray[i].destVert == index)
return i;
}
return -1;
}
}

  3.3.Vertex.java

 package com.cn.powergraph;
/**
* 带权图顶点类
* @author Administrator
*
*/
public class Vertex {
public char lable;
public boolean isInTree;
public Vertex(char lab){
lable = lab;
isInTree = false;
}
}

  3.4.Graph.java

 package com.cn.powergraph;
/**
* 带权图的类
* @author Administrator
*
*/
public class Graph {
private final int MAX_VERTS = 20;
private final int INFINITY = 1000000;
private Vertex[] vertList;
private int adjMat[][];
private int nVerts;
private int currentVert;
private PriorityQ thePQ;
private int nTree;
public Graph(){
vertList = new Vertex[MAX_VERTS];
adjMat = new int[MAX_VERTS][MAX_VERTS];
nVerts = 0;
for (int i = 0; i < MAX_VERTS; i++) {
for (int j = 0; j < MAX_VERTS; j++) {
adjMat[i][j] = INFINITY;
}
}
thePQ = new PriorityQ();
}
public void addVertex(char lab){
vertList[nVerts ++] = new Vertex(lab);
}
public void addEdge(int start,int end,int weight){
adjMat[start][end] = weight;
adjMat[end][start] = weight;
}
public void displayVertex(int v){
System.out.print(vertList[v].lable);
}
public void mstw(){
currentVert = 0;
while (nTree < nVerts - 1){
vertList[currentVert].isInTree = true;
nTree ++;
for (int i = 0; i < nVerts; i++) {
if (i == currentVert)
continue;
if (vertList[i].isInTree)
continue;
int distance = adjMat[currentVert][i];
if (distance == INFINITY)
continue;
putInPQ(i,distance);
}
if (thePQ.size() == 0)
{
System.out.println("GRAPH NOT CONNECTED");
return;
}
Edge theedge = thePQ.removeMin();
int sourceVert = theedge.srcVert;
currentVert = theedge.destVert;
System.out.print(vertList[sourceVert].lable);
System.out.print(vertList[currentVert].lable);
System.out.print(" ");
}
for (int i = 0; i < nVerts; i++) {
vertList[i].isInTree = false;
}
}
public void putInPQ(int newVert,int newDist){
int queueIndex = thePQ.find(newDist);
if (queueIndex != -1){
Edge tempEdge = thePQ.peekN(queueIndex);
int oldDist = tempEdge.distance;
if (oldDist > newDist){
thePQ.removeN(queueIndex);
Edge theEdge = new Edge(currentVert, newVert,newDist);
thePQ.insert(theEdge);
}
}
else{
Edge theEdge = new Edge(currentVert, newVert,newDist);
thePQ.insert(theEdge);
}
}
}

  3.5.GTest.java

 package com.cn.powergraph;
/**
* 带权图的测试
* @author Administrator
*
*/
public class GTest {
public static void main(String[] args) {
Graph g = new Graph();
g.addVertex('a');
g.addVertex('b');
g.addVertex('c');
g.addVertex('d');
g.addVertex('e');
g.addVertex('f');
g.addEdge(0, 1, 3);
g.addEdge(2, 1, 5);
g.addEdge(3, 1, 8);
g.addEdge(3, 2, 5);
g.addEdge(5, 4, 4);
g.addEdge(0, 4, 10);
g.mstw();
}
}

java数据结构----带权图的更多相关文章

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

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

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

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

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

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

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

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

  5. (5)Java数据结构--有继承图,用途分析

    java 中几种常用数据结构 - u010947402的博客 - CSDN博客http://blog.csdn.net/u010947402/article/details/51878166 JAVA ...

  6. java数据结构_笔记(4)_图

    图一.概念.图: 是一种复杂的非线性数据结构.图的二元组定义: 图 G 由两个集合 V 和 E 组成,记为:G=(V, E)  其中: V 是顶点的有穷非空集合,E 是 V 中顶点偶对(称为边)的有穷 ...

  7. java数据结构----图

    1.图:.在计算机程序设计中,图是最常用的数据结构之一.对于存储一般的数据问题,一般用不到图.但对于某些(特别是一些有趣的问题),图是必不可少的.图是一种与树有些相像的数据结构,从数学意义上来讲,树是 ...

  8. java数据结构_笔记(5)_图的算法

    图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...

  9. Java数据结构和算法(十五)——无权无向图

    前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做“树”是因为它看起来像一棵倒挂的树,包括二叉树.红黑树.2-3-4树.堆等各种不同的 ...

随机推荐

  1. BAPI_PO_CREATE1 创建PO ch_memory_complete = ‘x',导致hold on 解决方案,

    1.尝试注释标准逻辑,看会不会有什么问题, ZME_BAPI_PO_CUST IF_EX_ME_BAPI_PO_CREATE_02~INBOUND 里面有个控制很费解 我给注释了 2.改用 BAPI_ ...

  2. 提取html的正文

    1 using System;  2 using System.Text;  3 namespace HtmlStrip  4 {  5     class MainClass  6     {  7 ...

  3. datagrid 行号问题综合

    1.datagrid 左侧行号设置宽度 : 到 easyui.css 中修改 .datagrid-cell-rownumber 中 width 的宽度.

  4. mybatis编写流程(老版本的方式,新版本用接口式编程)

    1.根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息2.sql映射文件:配置了每一个sql,以及sql的封装规则等.  3.将sql映射文件注 ...

  5. Persistent connections CONN_MAX_AGE django

    Persistent connections¶ Persistent connections avoid the overhead of re-establishing a connection to ...

  6. 安装ubuntu16.04之后无法关机和重启

    这个问题是由于NVIDA驱动导致的,查询显卡型号,安装对应版本的驱动就可以解决此问题.ubuntu16.04 NVIDIA 驱动安装

  7. java:calendar类及一些比较实用的utils(一)

    在java编程中经常会用到时间日期的计算.比较.格式化等等操作,刚开始接触Calendar类时,还是在初学习期间,小小白一枚,看着这个好复杂,懒惰心理作祟也就没有怎么去学习,后来在项目中经常用到,索性 ...

  8. Java--常识

    一:J2SE/J2ME/J2EE Java2平台包括:标准版(J2SE).企业版(J2EE)和微缩版(J2ME)三个版本.J2SE,J2ME和J2EE,这也就是SunONE(Open NetEnvir ...

  9. Flutter实战视频-移动电商-15.首页_商品推荐模块编写

    15.首页_商品推荐模块编写 商品推荐,我们做成可以横向滚动的 分析: 上面是标题,下面是ListView,里面是一个Column, column分三层,第一是图片,第二是价格,第三是市场价格 小细节 ...

  10. AIRSDK 3.7 加载远程的含有代码的swf文件

    之前就说这个版本会解决可以加载远程的含有代码的swf文件的需求.但是,一直比较好奇这个是否行得通,还以为 Adobe 副总裁去了苹果,内部给了特殊待遇. 因为苹果一直就是不允许远程加载代码的,像js文 ...