public class UndirectedGraph {
private final int v;
private int e;
private Queue<Integer>[] adj;
public UndirectedGraph(int v){
this.v = v;
this.e = 0;
this.adj = new Queue[v];
for (int i = 0; i < adj.length; i++) {
adj[i] = new LinkedList<Integer>();
}
}
public int v(){
return v;
}
public int e(){
return e;
}
public void addEdge(int v, int w){
adj[v].add(w);
adj[w].add(v);
e++;
}
public Queue<Integer> adj(int v){
return adj[v];
}
}
使用dfs遍历无向图:
public class DepthFirstSearch {
private boolean[] visited;
private int count;
public DepthFirstSearch(UndirectedGraph g, int s){
this.visited = new boolean[g.v()];
this.count = 0;
dfs(g,s);
}
private void dfs(UndirectedGraph g, int v){
visited[v] = true;
LinkedList<Integer> adj = (LinkedList<Integer>) g.adj(v);
for (int i = 0; i < adj.size(); i++) {
if(!visited[adj.get(i)]){
dfs(g,adj.get(i));
}
}
count++;
}
public boolean isVisited(int w){
return visited[w];
}
public int count(){
return this.count;
}
}
测试:
public class DepthFirstSearchTest {
public static void main(String[] args) {
UndirectedGraph graph = new UndirectedGraph(13);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(0, 5);
graph.addEdge(0, 6);
graph.addEdge(5, 3);
graph.addEdge(5, 4);
graph.addEdge(3, 4);
graph.addEdge(4, 6);
graph.addEdge(7, 8);
graph.addEdge(9, 10);
graph.addEdge(9, 11);
graph.addEdge(9, 12);
graph.addEdge(11, 12);
DepthFirstSearch search = new DepthFirstSearch(graph, 0);
System.out.println("与节点0相通的节点个数:" + search.count());
System.out.println("节点0和节点5是否相通:" + search.isVisited(5));
System.out.println("节点0和节点7是否相通:" + search.isVisited(7));
System.out.println("节点0和节点9是否相通:" + search.isVisited(9));
}
}
使用bfs遍历无向图:
public class BreadthFirstSearch {
private boolean[] visited;
private int count;
private Queue<Integer> waitSearch;
public BreadthFirstSearch(UndirectedGraph g, int s){
this.visited = new boolean[g.v()];
this.count = 0;
this.waitSearch = new LinkedList<Integer>();
bfs(g,s);
}
private void bfs(UndirectedGraph g, int v){
visited[v] = true;
waitSearch.add(v);
while(!waitSearch.isEmpty()){
Integer w = waitSearch.poll();
LinkedList<Integer> adj = (LinkedList<Integer>) g.adj(w);
for (int i = 0; i < adj.size(); i++) {
if(!visited[adj.get(i)]){
bfs(g,adj.get(i));
}
}
}
this.count++;
}
public boolean isVisited(int w){
return visited[w];
}
public int count(){
return count;
}
}
测试:
public class BreadthFirstSearchTest {
public static void main(String[] args) {
UndirectedGraph graph = new UndirectedGraph(13);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(0, 5);
graph.addEdge(0, 6);
graph.addEdge(5, 3);
graph.addEdge(5, 4);
graph.addEdge(3, 4);
graph.addEdge(4, 6);
graph.addEdge(7, 8);
graph.addEdge(9, 10);
graph.addEdge(9, 11);
graph.addEdge(9, 12);
graph.addEdge(11, 12);
BreadthFirstSearch search = new BreadthFirstSearch(graph, 0);
System.out.println("与节点0相通的节点个数:" + search.count());
System.out.println("节点0和节点5是否相通:" + search.isVisited(5));
System.out.println("节点0和节点7是否相通:" + search.isVisited(7));
System.out.println("节点0和节点9是否相通:" + search.isVisited(9));
}
}
练习:
public class Exercise_graph {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("trffic_project.txt")));
Integer cities = Integer.parseInt(br.readLine());
UndirectedGraph g = new UndirectedGraph(cities);
Integer has_road = Integer.parseInt(br.readLine());
for (Integer i = 0; i < has_road; i++) {
String line = br.readLine();
String[] arr = line.split(" ");
int v = Integer.parseInt(arr[0]);
int w = Integer.parseInt(arr[1]);
g.addEdge(v,w);
}
DepthFirstSearch search = new DepthFirstSearch(g, 9);
System.out.println("9号城市是否与10号城市相通:" + search.isVisited(10));
System.out.println("9号城市是否与8号城市相通:" + search.isVisited(8));
}
}