java数据结构----带权图
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数据结构----带权图的更多相关文章
- Java数据结构——带权图
带权图的最小生成树--Prim算法和Kruskal算法 带权图的最短路径算法--Dijkstra算法 package graph; // path.java // demonstrates short ...
- 带权图的最短路径算法(Dijkstra)实现
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
- 无向带权图的最小生成树算法——Prim及Kruskal算法思路
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- C语言——无向带权图邻接矩阵的建立
#include <stdio.h> #include "Graph.h" #define MAX_INT 32767 /* #define vnum 20 #defi ...
- (5)Java数据结构--有继承图,用途分析
java 中几种常用数据结构 - u010947402的博客 - CSDN博客http://blog.csdn.net/u010947402/article/details/51878166 JAVA ...
- java数据结构_笔记(4)_图
图一.概念.图: 是一种复杂的非线性数据结构.图的二元组定义: 图 G 由两个集合 V 和 E 组成,记为:G=(V, E) 其中: V 是顶点的有穷非空集合,E 是 V 中顶点偶对(称为边)的有穷 ...
- java数据结构----图
1.图:.在计算机程序设计中,图是最常用的数据结构之一.对于存储一般的数据问题,一般用不到图.但对于某些(特别是一些有趣的问题),图是必不可少的.图是一种与树有些相像的数据结构,从数学意义上来讲,树是 ...
- java数据结构_笔记(5)_图的算法
图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...
- Java数据结构和算法(十五)——无权无向图
前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做“树”是因为它看起来像一棵倒挂的树,包括二叉树.红黑树.2-3-4树.堆等各种不同的 ...
随机推荐
- HLS切片机
参考: 1,linux下搭建生成HLS所需的.ts和.m3u8文件http://www.cnblogs.com/mystory/archive/2013/04/07/3006200.html2,iPh ...
- PySpider安装与使用(Windows系统下)
PySpider Begin 安装pip install pyspider 在windows系统好像会出现如下问题 Command "python setup.py egg_info&quo ...
- iOS 设备获取唯一标识符汇总
在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”. ...
- CSU 1554 SG Value —— 思维
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1554 Description The SG value of a set (mult ...
- Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)并执行wasm
<一>˙转换 Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)的步骤: 最新版本的Em ...
- JDBC 笔记3 通过PreparedStatement 对数据库进行增删改查 (转载)
之前MVC时一直用它,学了框架后就没怎么用了.这里转载一位同学的博客,以后可能也会用到的. 转自:https://www.cnblogs.com/zilong882008/archive/2011/1 ...
- observer远程监控服务器
因为需要监控服务器的状况,所以要使用工具observer.但是observer是采用wxWidget开发的,远程机器没有此环境.于是在windows机器上装了虚拟机ubuntu,又折腾erlang和w ...
- [Codeforces 877E] Danil and a Part-time Job
[题目链接] https://codeforces.com/contest/877/problem/E [算法] 首先求出这棵树的DFS序 一棵子树的DFS序为连续的一段 , 根据这个性质 , 用线段 ...
- 【旧文章搬运】为什么win32k.sys在System进程空间无法访问
原文发表于百度空间,2010-01-02========================================================================== 玩过Sha ...
- 3.sql中的向上递归和向下递归
1.向下递归 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with bmb ...