JAVA实践图的存储结构---邻接表(利用链表)
来源:互联网 发布:热血英豪mac 编辑:程序博客网 时间:2024/06/05 18:52
前言
关于邻接表,实现过一次数组版本的。
http://blog.csdn.net/xubaifu1997/article/details/51984760
虽然会写了,也感觉略绕,所以尝试用了自带的链表对象粗暴的实现了。
参考
图来自:http://www.cnblogs.com/skywang12345/p/3707612.html
如上图,有7个顶点。
我的实现思路非常粗暴,让每个顶点拥有一个链表。
那就7个链表了,让顶点与链表对应起来就可以实现。
链表的节点对象仅存储 末端的顶点和权值 。
那么起点顶点怎么办呢?我又用一个对象对它们进行组合,记录顶点的起点,以及链表。
所以,粗暴的实现如下:
class VertexNode { private int toVertex;//末端顶点 private int weightVertex;//权值 VertexNode(int toVertex, int weightVertex) { this.toVertex = toVertex; this.weightVertex = weightVertex; } public int getWeightVertex() { return weightVertex; } public int getToVertex() { return toVertex; }}
这个只针对邻接表设计的节点。
存着末端顶点,以及权值。那么其起点呢,请看下一个对象?
class LinkedVertex { private LinkedList<VertexNode> vertexNodes; private int fromVertex;//起点 LinkedVertex() { vertexNodes = new LinkedList<VertexNode>(); } public void setFromVertex(int fromVertex) { this.fromVertex = fromVertex; } public int getFromVertex() { return fromVertex; } public int edgeSize() { return vertexNodes.size(); } public void addNext(VertexNode to) { vertexNodes.addLast(to); } public VertexNode getEdge(int i) { return vertexNodes.get(i); } public void setEdge(int i, VertexNode v) { vertexNodes.set(i, v); }}
可以看到这里存储了起点以及一个链表。
因为不知道会与起点连接的顶点有几个,所以使用了链表来存储与该起点相连的顶点,及它们相连的权值。
使用的是时候就很简单了。
5个顶点:
LinkedVertex[] lvs = new LinkedVertex[5];0角标代表顶点1,1角标代表顶点2//假设顶点1与2相连,权值2//假设顶点1与3相连,权值4lvs[0] = new LinkedVertex();lvs[0].addNext(new VertexNode(2, 2));lvs[0].addNext(new VertexNode(3, 4));
取得话则使用写好的get方法即可。
lvs[0].getFromVertex();//获取起点lvs[0].getEdge(0).getToVertex();//获取第一个与其相连的端点lvs[0].getEdge(0).getWeightVertex();//获取权值
到此,实现得就是这么粗暴了。
完整代码实现
import java.util.LinkedList;import java.util.Scanner;public class PrimNewDemo { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n, m; n = in.nextInt(); m = in.nextInt(); LinkedVertex[] lvs = new LinkedVertex[n]; for (int i = 0; i < n; i++) { lvs[i] = new LinkedVertex(); lvs[i].setFromVertex(i + 1); } int from, to, weight; for (int i = 0; i < m; i++) { from = in.nextInt(); to = in.nextInt(); weight = in.nextInt(); //模拟无向图 lvs[from - 1].addNext(new VertexNode(to, weight)); lvs[to - 1].addNext(new VertexNode(from, weight)); } showMap(lvs, n); } static void showMap(LinkedVertex[] lvs, int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < lvs[i].edgeSize(); j++) { System.out.println(lvs[i].getFromVertex() + " to " + lvs[i].getEdge(j).getToVertex() + " weight:" + lvs[i].getEdge(j).getWeightVertex()); } } }}class LinkedVertex { private LinkedList<VertexNode> vertexNodes; private int fromVertex; LinkedVertex() { vertexNodes = new LinkedList<VertexNode>(); } public void setFromVertex(int fromVertex) { this.fromVertex = fromVertex; } public int getFromVertex() { return fromVertex; } public int edgeSize() { return vertexNodes.size(); } public void addNext(VertexNode to) { vertexNodes.addLast(to); } public VertexNode getEdge(int i) { return vertexNodes.get(i); } public void setEdge(int i, VertexNode v) { vertexNodes.set(i, v); }}class VertexNode { private int toVertex;//顶点信息 private int weightVertex;//权值 VertexNode(int toVertex, int weightVertex) { this.toVertex = toVertex; this.weightVertex = weightVertex; } public int getWeightVertex() { return weightVertex; } public int getToVertex() { return toVertex; }}
结果
输入:6 92 4 113 5 134 6 35 6 42 3 64 5 71 2 13 4 91 3 2输出:1 to 2 weight:11 to 3 weight:22 to 4 weight:112 to 3 weight:62 to 1 weight:13 to 5 weight:133 to 2 weight:63 to 4 weight:93 to 1 weight:24 to 2 weight:114 to 6 weight:34 to 5 weight:74 to 3 weight:95 to 3 weight:135 to 6 weight:45 to 4 weight:76 to 4 weight:36 to 5 weight:4
结束感言
嗯,这样子写了之后,个人感觉比数组版的更好用了,而且存储无向图更方便。实在是居家旅行,杀人必备良品(逃
END
0 0
- JAVA实践图的存储结构---邻接表(利用链表)
- 图的存储结构(邻接表)
- JAVA实践数组版图存储结构--邻接表
- 图的存储结构(邻接矩阵、边数组、邻接表、十字链表、邻接多重表)
- 图的邻接表存储结构
- 图的邻接表存储结构
- 图的常用存储结构----邻接表
- 图的邻接表存储结构
- 图的邻接表存储结构
- 图的存储结构 --- 邻接表
- 图的常用存储结构----邻接表
- 图的存储结构-邻接表
- 邻接表 图的存储结构
- 7.2图的存储结构(邻接表)
- 图的存储结构之邻接表
- 图的存储结构——邻接链表
- 利用邻接表存储结构创建一个图(有向、无向)
- 图的存储结构(十字链表、邻接多重表、边集数组)
- linux C语言Socket编程实现原理及简单示例
- linphone-KeepAliveReceiver.java文件分析
- Majority Vote
- TP框架中的增删改查
- NYOJ 90 整数划分
- JAVA实践图的存储结构---邻接表(利用链表)
- std::string::find() 和 std::string::npos
- Caffe中的Makefile.config的一些说明
- APPIUM环境搭建
- NYOJ-32 组合数
- 算法导论 12章 二叉搜索树
- 记一次有趣的DirectX11程序闪屏的Debug过程
- 杂感与摘录
- 计算从1到N的自然数中取M个数的所有组合的lua函数