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. Linux下直接读写物理地址内存

    虚拟 转 物理地址  virt_to_phys( *addr );物理 转 虚拟地址  phys_to_virt( *addr ); 如: unsigned long pProtectVA; phys ...

  2. git 合并子分支

    1.子分支 $ git status 位于分支 base 无文件要提交,干净的工作区 2.子分支更新 $ git pull origin base 来自 http://106.14.59.204/ji ...

  3. C#入门---1、C#装备知识(C#如何学习)

    C#入门---1.C#装备知识(C#如何学习) 一.总结 一句话总结: 主视频,辅助书和教程:还是得看视频,直接看书或者看教程效率不高 1.C#和.NET的关系和区别? .net是一个平台,核心是.n ...

  4. python multiprocessing多进程应用

    multiprocessing包是Python中的多进程管理包,可以利用multiprocessing.Process对象来创建进程,Process对象拥有is_alive().join([timeo ...

  5. BZOJ2006:超级钢琴(ST表+堆求前K大区间和)

    Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...

  6. BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树+dfs序

    BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道 ...

  7. c++之拷贝构造函数详解

    C++中经常使用一个常量或变量初始化另一个变量,例如: double x=5.0: double y=x; 使用类创建对象时,构造函数被自动调用以完成对象的初始化,那么能否象简单变量的初始化一样,直接 ...

  8. bzoj 3309 DZY Loves Math——反演+线性筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然 ...

  9. HDU 1394 树状数组+离散化求逆序数

    对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...

  10. 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归

    标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次, ...