基于图的深度优先搜索
图学习笔记索引
图学习笔记索引(全部)
001自定义输入流In类实现
002背包数据类型Bag实现
003无向图数据类型实现
004基于图的深度优先搜索
005使用深度优先搜索找图中的所有连通分量
005-1基于深度优先搜索查找图中连通路径
006基于深度优先搜索判断图中是否存在环
007基于深度优先搜索判断一个无向图图是否是一个二分图
008广度优先搜索查找连通图中的最短路径
009有向图数据类型实现
010有向图的可达性
011带权重的无向边数据类型Edge实现
012加权无向图数据类型实现
本文代码来自《算法(第4版)》
基于图的深度优先搜索
1.自定义输入流In
从文件中读取无向图图的顶点关系。
tinyWG.txt文件中的第一行为顶点数,第二行为边数。
第三行到最后是两个相邻的顶点:
13
13
0 5
4 3
0 1
9 12
6 4
5 4
0 2
11 12
9 10
0 6
7 8
9 11
5 3
routes.txt 内容:
JFK MCO
ORD DEN
ORD HOU
DFW PHX
JFK ATL
ORD DFW
ORD PHX
ATL HOU
DEN PHX
PHX LAX
JFK ORD
DEN LAS
DFW HOU
ORD ATL
LAS LAX
ATL MCO
HOU MCO
LAS PHX
tinyDG.txt中的内容:
13
22
4 2
2 3
3 2
6 0
0 1
2 0
11 12
12 9
9 10
9 11
8 9
10 12
11 4
4 3
3 5
7 8
8 7
5 4
0 5
6 4
6 9
7 6
tinyEWG.txt中的内容:
8
16
4 5 0.35
4 7 0.37
5 7 0.28
0 7 0.16
1 5 0.32
0 4 0.38
2 3 0.17
1 7 0.19
0 2 0.26
1 2 0.36
1 3 0.29
2 7 0.34
6 2 0.40
3 6 0.52
6 0 0.58
6 4 0.93
点击文字获取:001自定义输入流In类实现
2.定义背包类Bag
3.无向图G的构造
从文件中读取图的顶点信息,构造一幅无向图。
点击文字获取:003无向图数据类型实现
4.深度优先搜索DepthFirstSearch
package algorithms.graph;
import java.io.IOException;
/*
* 深度优先搜索
* 可判断两个顶点是否连通;
* 可计算与起点相连通的顶点的个数;
* 可用于计算连通分量的个数;
* 可用于判断顶点在哪个连通分量重;
* */
public class DepthFirstSearch {
private boolean[] marked;
private int count;
public DepthFirstSearch(Graph G, int s){
marked = new boolean[G.V()];
dfs(G, s);
}
public void dfs(Graph G, int v){
marked[v] = true;
count++;
for(int w : G.adj(v))
if(!marked[w])
dfs(G, w);
}
public boolean marked(int w){
return marked[w];
}
//与起点s相连通的顶点的个数
public int count(){
return count;
}
public static void main(String[] args) throws IOException {
In in = new In("D:\\tinyWG.txt");
Graph G = new Graph(in);
int s = 0;
DepthFirstSearch depthfs = new DepthFirstSearch(G, s);
System.out.println("与顶点"+s+"相连通的顶点个数: "+depthfs.count());
for(int v = 0; v < G.V(); v++)
System.out.println(s+"与"+v+"是否连通:"+depthfs.marked(v));
}
}