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树.堆等各种不同的 ...
随机推荐
- Disruptor学习杂记
慎入,有点乱,只是学习记录,disruptor_2.10.4 1.Disruptor对象有一个EventProcessorRepository对象 2.EventProcessorReposito ...
- POJ2018 Best Cow Fences —— 斜率优化DP
题目链接:https://vjudge.net/problem/POJ-2018 Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K T ...
- Codeforces Round #376 (Div. 2) F. Video Cards —— 前缀和 & 后缀和
题目链接:http://codeforces.com/contest/731/problem/F F. Video Cards time limit per test 1 second memory ...
- 人生苦短之Python枚举类型enum
枚举类型enum是比较重要的一个数据类型,它是一种数据类型而不是数据结构,我们通常将一组常用的常数声明成枚举类型方便后续的使用.当一个变量有几种可能的取值的时候,我们将它定义为枚举类型.在Python ...
- java HttpClient POST请求
一个简单的HttpClient POST 请求实例 package com.httpclientget; import java.awt.List; import java.util.ArrayLis ...
- 【概念】SVG(1)
ok,我们讲讲svg 学习前提:懂HTML和基本的XML SVG简介: 1.SVG全称Scable Vector Graphic,可伸缩的矢量图 2.SVG用于定义针对于Web的基于矢量的图形 3.S ...
- 在KitKat(Android 4.4.2) 推送网址给手机
弱者才会回避问题. 最近想把网址推送给手机实现后台下载,打算故技重施,用短信传送然后中断广播的方法实现隐蔽传送.试了半天发现怎么现在拦不住短信了.查了一下才发现原来Android4.4增加了一个安全机 ...
- 「AHOI2008」「LuoguP4281」紧急集合 / 聚会(LCA
题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要 ...
- POJ1904(有向图缩点+输入输出挂参考)
King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 8311 Accepted: 3017 Cas ...
- android手机各大分区详解
1. bootloader 当我们拿到一款手机,第一件事应该就是按下电源键开机,那么从开机到进入到桌面程序这中间发生了些什么呢,我们从下面这张简化了的手机结构图开始: 注意:该结构图并不反映手机的实 ...