JAVA实现图的邻接表以及DFS

一:定义邻接表结构储存图

package 图的遍历;

//邻接表实现图的建立

//储存边
class EdgeNode {
	int index; // 习惯了用index,其实标准写法是(adjVertex)
	int value; // 权值
	EdgeNode nextArc; // 指向下一条弧
}

// 邻接表节点的类型
class VertexNode {
	String name;
	EdgeNode firstArc = new EdgeNode(); // 指向第一条弧
}

public class Graph {
	VertexNode[] adjList; // 保存邻接表的头节点
	int e; // 图的边数
	int v; // 图的顶点数
	boolean[] visit;

	public Graph(int v, int e) {
		this.v = v;
		this.e = e;
		adjList = new VertexNode[e + 1]; // 学习Java养成的好习惯,动态分配空间,创建顶点表数组
		visit = new boolean[e + 1];  //标记
		for (int i = 0; i < e; i++) {
			visit[i] = false;
		}
	}
}

  二:DFS过程

package 图的遍历;

public class DFSGraph {
	public static void DFS(Graph G, int k) {
		System.out.println(G.adjList[k].name);
		G.visit[k] = true;
		EdgeNode p = new EdgeNode();
		p = G.adjList[k].firstArc;
		while(p!=null){
			if(G.visit[p.index]!=true){
				DFS(G,p.index);
			}

			p=p.nextArc;
		}
	}

}

  三:建立图

package 图的遍历;

import java.util.Scanner;

public class CreateGraph {
	private static Graph G;
	public static Graph getGraph(){
		return G;
	}
	public static void createGraph() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入顶点数v和边数e:");
		int v = sc.nextInt();
		int e = sc.nextInt();
		G = new Graph(v, e);
		System.out.println("请输入各顶点信息:");
		for (int i = 0; i < G.v; i++) {
			G.adjList[i] = new VertexNode();
			G.adjList[i].name = sc.next();
			G.adjList[i].firstArc = null; // 不可或缺
		}
		System.out.println("请输入各边信息(用空格隔开):");
		for (int i = 0; i < G.e; i++) {
			EdgeNode en1 = new EdgeNode();
			// 保证e1,e2都是合法输入
			String e1 = sc.next();
			String e2 = sc.next();
			int v1 = Index(e1);
			int v2 = Index(e2);
			en1.index = v1; // en1的下标是v1
			en1.nextArc = G.adjList[v2].firstArc;
			G.adjList[v2].firstArc = en1;

			EdgeNode en2 = new EdgeNode();
			en2.index = v2; // en2的下标是v2
			en2.nextArc = G.adjList[v1].firstArc;
			G.adjList[v1].firstArc = en2;
		}
	}
	public static void outputGraph() {  //不知道为何空指针异常
		try {
			System.out.println("输出邻接表存储情况:");
			EdgeNode en = new EdgeNode();
			for (int i = 0; i < G.e; i++) {
				System.out.print(G.adjList[i].name);
				en = G.adjList[i].firstArc;
				while (en != null) {
					System.out.print("->" + G.adjList[en.index].name);
					en = en.nextArc;
				}
				System.out.println();
			}
		} catch (NullPointerException e) {

		}

	}
	private static int Index(String e1) {
		for (int i = 0; i < G.v; i++) {
			if (G.adjList[i].name.equals(e1)){
				return i;
			}
		}
		return -1;
	}
}

  四:测试

package 图的遍历;

public class GraphDemo {
	public static void main(String[] args) {
		CreateGraph.createGraph();
		CreateGraph.outputGraph();

		System.out.println("DFS图的过程如下:");
		DFSGraph.DFS(CreateGraph.getGraph() , 0);
	}
}
/*
 * 请输入顶点数v和边数e: 4 5
 * 请输入各顶点信息: a b c d
 * 请输入各边信息(用空格隔开):
 * a b
 * a c
 * a d
 * b c
 * b d
 */

  五,测试结果

时间: 2024-10-07 22:03:54

JAVA实现图的邻接表以及DFS的相关文章

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

图的邻接表表示、广度优先、深度优先搜索

图,就是我们在数据结构中学到的图,它是一种存储信息的结构.图是一类在实际应用中非常常见的数据结构,当数据规模大到一定程度时,如何对其进行高效计算即成为迫切需要解决的问题.最常见的大规模图数据的例子就是互联网网页数据,网页之间通过链接指向形成规模超过500 亿节点的巨型网页图.再如,Facebook 社交网络也是规模巨大的图,仅好友关系已经形成超过10 亿节点.千亿边的巨型图,考虑到Facebook 正在将所有的实体数据节点都构建成网状结构,其最终形成的巨型网络数据规模可以想见其规模.要处理如此规

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另

数据结构之---C语言实现图的邻接表存储表示

// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 3 // 顶点字符串的最大长度+1 #define MAX_VERTEX_NUM 20 typedef int InfoType; // 存放网的权值 typedef char VertexType[MAX_NAME]; // 字符串类型 typedef enum{DG, DN, AG

PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)

//采用不同的图存储结构结构邻接矩阵.邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替......怕了并查集了 //邻接矩阵dfs #include<cstdio>#include<algorithm>using namespace std;const int maxn=1001;int g[maxn][maxn];int n,tmp;bool vis[maxn];void dfs(int v){ vis[v]=true; for(int

基于C++ STL图的邻接表表示及深度、广度搜索实现

基于C++ STL图的邻接表表示及深度.广度搜索实现,对图论的学习有帮助,代码如下: #include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存

邻接表的dfs遍历

//输入样例 /* 5 0 AB AD AC CD BE DE */ //输出 /* Please Input the edge x-->y:AB AD AC CD BE DE A 1 2 3 B 0 4 C 0 3 D 0 2 4 E 1 3 */ //dfs测试数据 /* 8 0 Please Input the edge x-->y:AB AC BD BE DH EH HF HG FC GC CA A 1 2 2 B 0 3 4 C 0 0 5 6 D 1 7 E 1 7 F 2 7 G

图(邻接表)

我们先来看一个图 我们想将这个图的信息存储到邻接表中,我们需要一个数组保存节点信息,还要有一个节点用来保存与该节点相邻的节点信息. 1 typedef struct arc_node 2 { 3 int pos; 4 int distance; 5 struct arc_node * next; 6 } Arc_node;//保存Node节点的相邻节点信息 7 8 typedef struct node 9 { 10 node_type info; 11 Arc_node * next; 12

数据结构(10) -- 图的邻接表存储

////////////////////////////////////////////////////////// //图的邻接表存储 ////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> using namespace std; //图的邻接表表示法 #define MaxVertexNum 100 enum GraphType{DG,