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
*/
五,测试结果

JAVA实现图的邻接表以及DFS的更多相关文章
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...
- PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)
//采用不同的图存储结构结构邻接矩阵.邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替......怕了并查集了 //邻接矩阵dfs #include< ...
- 数据结构之---C语言实现图的邻接表存储表示
// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...
- c_数据结构_图_邻接表
课程设计------邻接表 图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip #include<stdio.h> ...
- 图的邻接表存储表示(C)
//---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...
- 图的邻接表存储 c实现
图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...
- 基于visual Studio2013解决算法导论之053图的邻接表表示
题目 图的邻接表表示 解决代码及点评 // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <sta ...
- 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)
1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...
- 用邻接表实现DFS和BFS
#include <stdio.h> #include <stdlib.h> #define MAXVERTEX 10 typedef char VertexType; //顶 ...
随机推荐
- redis2.8.xx安装配置
一.简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集 ...
- 使用Ajax内容签名,减少流量浪费
前端UI界面用Ajax获取数据内容的时候,一般是直接获取内容数据并填充,不管内容有无变化,不管数据量多大,都是直接重新加载数据,例如定时刷新公告等. 今天在浏览器控制台调试的时候,发现动态刷新内容,其 ...
- 解题:由乃OI 2018 五彩斑斓的世界
题面 写在前面的扯淡: 分块的总体学习告一段落,这算是分块集中学习的最后一题么:以后当然也可能会写,就是零零散散的题了=.= 在洛谷上搜ynoi发现好像只有这道题和 由乃OI 2018 未来日记 是分 ...
- LOJ #6036.「雅礼集训 2017 Day4」编码 Trie树上2-sat
记得之前做过几道2-sat裸体,以及几道2-sat前缀优化建图,这道题使用了前缀树上前缀树优化建图.我们暴力建图肯定是n^2级别的,那么我们要是想让边数少点,就得使用一些骚操作.我们观察我们的限制条件 ...
- 根据数据库连接的java.sql.Connection获取数据库名称
// 获取数据库的元数据信息 DatabaseMetaData metaData = conn.getMetaData(); // 获取数据库名称的方法 System.out.println(meta ...
- 学习 opencv---(13)opencv霍夫变换:霍夫线变换,霍夫圆变换
在本篇文章中,我们将一起学习opencv中霍夫变换相关的知识点,以及了解opencv中实现霍夫变换的HoughLines,HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircles ...
- 服务器上 tomcat 配置了 tomcat-users 但是还是 403 的问题
默认情况下,tomcat 限制了只能本机访问 如果我们想要修改这个设置: 编辑 webapps/manager/META-INF/context.xml <!--<Valve classN ...
- webpack中Module build failed: Unknown word (2:1)
在新建的webpack.config.js文件中配置好style-loader和css-loader,注意顺序为:style-loader,css-loader,less-loader,postcss ...
- 前端PHP入门-012-回调函数[慎入]
尽力而为,对于WEB前端和美工同学,比较难了!但是你们都学过JS的闭包等操作,那么这里也一定没有问题! 回调函数,可以配合匿名函数和变量函数实现更加优美.复杂的一种函数结构. 回调函数,就是在处理一个 ...
- 编写可移植C/C++程序的要点
1.分层设计,隔离平台相关的代码.就像可测试性一样,可移植性也要从设计抓起.一般来说,最上层和最下层都不具有良好的可移植性.最上层是GUI,大多数GUI都不是跨平台的,如Win32 SDK和MFC.最 ...