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. ABAP OLE常用方法和属性

    转自 http://www.cnblogs.com/eric0701/p/5213694.htmlSAP EXCEL OLE常用方法和属性 附加网上找到的比较好的源代码示例一份 1.ole中如何保存和 ...

  2. Python 参数校验的进化

    Python 函数参数魔法 事情的起因是感觉目前项目中的参数校验方法写的太简单了,很多时候需要在server层再if else处理,于是就动手准备写一个好用一点的,可以自定义校验参数规则的参数校验器, ...

  3. eval函数用法

    JavaScript 全局对象 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字 ...

  4. Ubuntu 14.04 下 android studio 安装 和 配置【转】

    本文转载自:http://blog.csdn.net/xueshanfeihu0/article/details/52979717 Ubuntu 14.04 下 android studio 安装 和 ...

  5. ansible 基础知识

    英文官网,值得拥有! http://docs.ansible.com/ansible/list_of_files_modules.html# 摘自: http://blog.csdn.net/b624 ...

  6. FLV文件格式解析(转)

    FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧.封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式.另外由于当前浏览器与F ...

  7. 数据摘要pandas

    主要是用于分析数据的Pandas库 先学习两个数据类型DataFrame和series 进一步学习利用Pandas进行摘要的方法, 提取数据的特征 1 pandas库 1.1 pandas库 pand ...

  8. BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset

    BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i ...

  9. 激活层和pooling的作用

    激活层: 激活函数其中一个重要的作用是加入非线性因素的,将特征映射到高维的非线性区间进行解释,解决线性模型所不能解决的问题 pooling层: 1. invariance(不变性),这种不变性包括tr ...

  10. PTA-数据结构 Dijkstra 城市间紧急救援

    城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...