图的API及其两种实现(邻接矩阵,邻接表 )
来源:互联网 发布:文明6 for mac 编辑:程序博客网 时间:2024/06/05 08:28
图上的基本分方法可以抽象如下
package lee.graph;import java.io.FileNotFoundException;public interface Graph {public void initGraph(String path) throws FileNotFoundException;public int getWeight(int v , int w);public int getFirstNeighbor(int v);public int getNextNeighbor(int v, int w);public void setWeight(int v, int w , int power);public void printGraph();public int getNumVertex();public int getNumEdge();public int getOutDegree(int v);public int getInDegree(int v);}
常见的实现有 邻接矩阵法 和邻接表法。 注意图上的算法 和图本书的存储方式是无关的, 很多书都没有严格区分这一点。
图上的算法 比如 最小生成树 最短路径 遍历 拓扑排序等,仅依赖与API而不是图的具体实现。后续的文章会给出图上的常用算法。
邻接矩阵的实现:
package lee.graph;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.Scanner;public class MatrixGraph implements Graph{private int numVertex;private int numEdge;private int[][] matrix;public MatrixGraph(int numOfV , int numOfE){this.numEdge = numOfE;this.numVertex = numOfV;matrix = new int[numOfE][numOfE];}@Overridepublic void initGraph(String path) throws FileNotFoundException {for(int i =0 ; i<numVertex;i++){for(int j=0;j<numVertex;j++){matrix[i][j] = 999;}} Scanner in = new Scanner(new FileInputStream(path)); while (in.hasNext()) { int i = in.nextInt(); int j = in.nextInt(); int weight = in.nextInt(); setWeight(i,j,weight); }}@Overridepublic int getWeight(int v, int w) {return matrix[v][w];}@Overridepublic int getFirstNeighbor(int v) {for(int i=0; i<numVertex;i++){if(matrix[v][i]!=999 &&v!=i ){return i;}}return -1;}@Overridepublic int getNextNeighbor(int v, int w) {for(int i=w+1; i<numVertex;i++){if(matrix[v][i]!=999 && v!=i){return i;}}return -1;}@Overridepublic void setWeight(int v, int w, int power) { matrix[v][w] = power;}@Overridepublic void printGraph() {for(int i=0; i< numVertex; i++){for(int j=0; j<numVertex; j++){if(matrix[i][j] != 999 && i!=j){System.out.println(i + " " + j + " " + matrix[i][j]);}}}}@Overridepublic int getNumVertex() {return numVertex;}@Overridepublic int getNumEdge() {return numEdge;}@Overridepublic int getOutDegree(int v) {int count=0;for(int i=0; i<numVertex; i++){if(matrix[v][i] != 999 && v!=i){count++;}}return count;}@Overridepublic int getInDegree(int v) {int count=0;for(int i=0; i<numVertex; i++){if(matrix[i][v] != 999 && v!=i){count++;}}return count;}}
注: 节点不连接时,记其权值为999
图的邻接表实现:
package lee.graph;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.Scanner;public class LinkedGraph implements Graph{private int numVertex;private int numEdge;ArrNode [] arr;public LinkedGraph(int numV,int numE){this.numEdge = numE;this.numVertex = numV;arr = new ArrNode[numV];for(int i=0;i<arr.length;i++){arr[i] = new ArrNode();}}@Overridepublic void initGraph(String path) throws FileNotFoundException {Scanner in = new Scanner(new FileInputStream(path));while(in.hasNext()){int i = in.nextInt();int j = in.nextInt();int k = in.nextInt();if(arr[i].next==null){arr[i].next = new GNode(j,k);}else{GNode p = arr[i].next;while(p.next!=null){p=p.next;}p.next = new GNode(j,k);}}}@Overridepublic int getWeight(int v, int w) {GNode p = arr[v].next;while(p!=null && p.num!=w){p=p.next;}if(p==null){return 999;}else{return p.weight;}}@Overridepublic int getFirstNeighbor(int v) {GNode p = arr[v].next;if(p==null){return -1;}else{return p.num;}}@Overridepublic int getNextNeighbor(int v, int w) {GNode p = arr[v].next;while(p!=null && p.num!=w){p=p.next;}if(p.num == w && p.next !=null){return p.next.num;}return -1;}@Overridepublic void setWeight(int v, int w, int power) {GNode p = arr[v].next;while(p.next!=null && p.num!=w){p=p.next;}if(p.num==w){p.weight=power;;}else{p.next = new GNode(w,power);}}@Overridepublic void printGraph() {for(int i=0;i<numVertex;i++){GNode p = arr[i].next;while(p!=null){System.out.println(i+" "+p.num+" "+p.weight);p=p.next;}}}@Overridepublic int getNumVertex() {return numVertex;}@Overridepublic int getNumEdge() {return numEdge;}class GNode{int num;int weight;GNode next;GNode(int n,int w){this.num = n;this.weight = w;}}class ArrNode{GNode next;}@Overridepublic int getOutDegree(int v) {int count=0;GNode p = arr[v].next;while(p!=null){p=p.next;count++;}return count;}@Overridepublic int getInDegree(int v) {int count=0;for(int i =0; i < numVertex; i++){if(v!=i && getWeight(i,v)!=999){count++;}}return count;}}
- 图的API及其两种实现(邻接矩阵,邻接表 )
- 邻接矩阵(以顶点为中心),比较稀疏时,采用邻接表;图的两种遍历(邻接矩阵实现)
- 图的两种结构(邻接矩阵、邻接表)DFS、BFS算法
- Graph(2)--图的实现(邻接矩阵&邻接表 )
- 图的实现(一)-邻接矩阵和邻接表
- 基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS
- 图及其存储结构(邻接矩阵、邻接表)
- 图(邻接矩阵->邻接表:邻接表->邻接矩阵)
- 实现图的邻接矩阵和邻接表的存储
- 实现图的邻接矩阵和邻接表的存储
- java版 图的邻接表、邻接矩阵、BFS、DFS 实现
- 图的基本知识及实现_邻接矩阵_邻接表
- 图 邻接矩阵 邻接表
- 图的遍历(BFS、DFS的邻接矩阵和邻接表实现)
- [C++]图的邻接矩阵、邻接表及其相互转化和邻接表的广度遍历、深度遍历
- 算法导论--图的存储(邻接表与邻接矩阵)
- 图的遍历与输出 (邻接矩阵和邻接表)
- 图的表示(邻接矩阵和邻接表)
- 【转载】FileUpload控件如何实现文件上传
- 虚函数机制
- 【Apache Solr系列之四】Solr客户端SolrJ API使用文档-查询实例
- 感动!刘若英和陈升的那些往事
- SSH Secure File Transfer 在linux下 中文乱码的解决办法
- 图的API及其两种实现(邻接矩阵,邻接表 )
- 错误:unqualified-id before numeric constant的原因
- tableviewcell重绘
- 在ubuntu下编译安装内核及其卸载
- 二叉链表实现二叉树
- 你们如何看bitcoin前景
- android 获取本机号码需要root吗?
- flussh logs的含义
- 比特币网络的弱点(二)