图的深度优先搜索(DFS),广度优先搜索(BFS)与最小生成树(MST)
2015-10-23 17:16
447 查看
DFS
MST
package org.exam.ch13.mst;
/**
* Created by xin on 15.10.18.
*/
class StackX {
private final int SIZE = 20;
private int[] st;
private int top;
public StackX() {
st = new int[SIZE];
top = -1;
}
public void push(int j) {
st[++top] = j;
}
public int pop() {
return st[top--];
}
public int peek() {
return st[top];
}
public boolean isEmpty() {
return (top == -1);
}
}
class Vertex{
public char label;
public boolean wasVisited;
public Vertex(char label) {
this.label = label;
}
}
class Graph{
private final int MAX_VERTS=20;
private Vertex[] vertexList;
private int[][] adjMat;
private int nVerts;//默认值为0
private StackX stackX;
public Graph(){
vertexList=new Vertex[MAX_VERTS];//里面元素为空
adjMat=new int[MAX_VERTS][MAX_VERTS];//元素默认值都为0
stackX=new StackX();
}
public void addVertex(char label){
vertexList[nVerts++]=new Vertex(label);
}
public void addEdge(int start,int end){
adjMat[start][end]=1;
adjMat[end][start]=1;
}
public void displayVertex(int index){
System.out.print(vertexList[index].label);
}
public int getAdjUnvisitedVertex(int v){
for (int i = 0; i < nVerts; i++) {
if (adjMat[v][i]==1&&vertexList[i].wasVisited==false){
return i;
}
}
return -1;
}
public void mst(){
vertexList[0].wasVisited=true;
stackX.push(0);
while (!stackX.isEmpty()){
int curVertex=stackX.peek();
int v=getAdjUnvisitedVertex(curVertex);
if (v==-1){
stackX.pop();
}else{
vertexList[v].wasVisited=true;
displayVertex(curVertex);
displayVertex(v);
System.out.print(" ");
stackX.push(v);
}
}
for (int i = 0; i < nVerts; i++) {
vertexList[i].wasVisited=false;
}
}
}
public class App {
public static void main(String[] args) {
Graph graph = new Graph();
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
graph.addVertex('D');
graph.addVertex('E');
graph.addEdge(0,1);
graph.addEdge(0,2);
graph.addEdge(0,3);
graph.addEdge(0,4);
graph.addEdge(1,2);
graph.addEdge(1,3);
graph.addEdge(1,4);
graph.addEdge(2,3);
graph.addEdge(2,4);
graph.addEdge(3,4);
System.out.print("Minimum spanning tree: ");
graph.mst(); // minimum spanning tree
System.out.println();
}
}
package org.exam.ch13.dfs; /** * Created by xin on 15.10.18. */ class StackX { private final int SIZE = 20; private int[] st; private int top; public StackX() { st = new int[SIZE]; top = -1; } public void push(int j) { st[++top] = j; } public int pop() { return st[top--]; } public int peek() { return st[top]; } public boolean isEmpty() { return (top == -1); } } class Vertex{ public char label; public boolean wasVisited; public Vertex(char label) { this.label = label; } } class Graph{ private final int MAX_VERTS=20; private Vertex[] vertexList; private int[][] adjMat; private int nVerts;//默认值为0 private StackX stackX; public Graph(){ vertexList=new Vertex[MAX_VERTS];//里面元素为空 adjMat=new int[MAX_VERTS][MAX_VERTS];//元素默认值都为0 stackX=new StackX(); } public void addVertex(char label){ vertexList[nVerts++]=new Vertex(label); } public void addEdge(int start,int end){ adjMat[start][end]=1; adjMat[end][start]=1; } public void displayVertex(int index){ System.out.print(vertexList[index].label); } public int getAdjUnvisitedVertex(int v){ for (int i = 0; i < nVerts; i++) { if (adjMat[v][i]==1&&vertexList[i].wasVisited==false){ return i; } } return -1; } public void dfs(){ vertexList[0].wasVisited=true; displayVertex(0); stackX.push(0); while (!stackX.isEmpty()){ int curVertex=stackX.peek(); int v=getAdjUnvisitedVertex(curVertex); if (v==-1){ stackX.pop(); }else{ vertexList[v].wasVisited=true; displayVertex(v); stackX.push(v); } } for (int i = 0; i < nVerts; i++) { vertexList[i].wasVisited=false; } } } public class App { public static void main(String[] args) { Graph graph = new Graph(); graph.addVertex('A'); graph.addVertex('B'); graph.addVertex('C'); graph.addVertex('D'); graph.addVertex('E'); graph.addEdge(0,1); graph.addEdge(1,2); graph.addEdge(0,3); graph.addEdge(3,4); System.out.println("Visits:"); graph.dfs(); System.out.println(); } }BFS
package org.exam.ch13.bfs; /** * Created by xin on 15.10.20. */ class Queue { private final int SIZE = 20; private int[] queArray; private int front; private int rear; public Queue() { queArray = new int[SIZE]; front = 0; rear = -1; } public void insert(int j) { if (rear == SIZE - 1) rear = -1; queArray[++rear] = j; } public int remove() { int temp = queArray[front++]; if (front == SIZE) front = 0; return temp; } public boolean isEmpty() { return (rear + 1 == front || (front + SIZE - 1 == rear)); } } class Vertex { public char label; // label (e.g. 'A') public boolean wasVisited; public Vertex(char lab) { label = lab; wasVisited = false; } } class Graph{ private final int MAX_VERTS=20; private Vertex[] vertexList; private int[][] adjMat; private int nVerts;//默认值为0 private Queue queue; public Graph(){ vertexList=new Vertex[MAX_VERTS];//里面元素为空 adjMat=new int[MAX_VERTS][MAX_VERTS];//元素默认值都为0 queue=new Queue(); } public void addVertex(char label){ vertexList[nVerts++]=new Vertex(label); } public void addEdge(int start,int end){ adjMat[start][end]=1; adjMat[end][start]=1; } public void displayVertex(int index){ System.out.print(vertexList[index].label); } public int getAdjUnvisitedVertex(int v){ for (int i = 0; i < nVerts; i++) { if (adjMat[v][i]==1&&vertexList[i].wasVisited==false){ return i; } } return -1; } public void bfs(){ vertexList[0].wasVisited=true; displayVertex(0); queue.insert(0); int v2; while (!queue.isEmpty()) { // until queue empty, int v1 = queue.remove(); // remove vertex at head // until it has no unvisited neighbors while ((v2 = getAdjUnvisitedVertex(v1)) != -1) { // get one, vertexList[v2].wasVisited = true; // mark it displayVertex(v2); // display it queue.insert(v2); // insert it } // end while } for (int i = 0; i < nVerts; i++) { vertexList[i].wasVisited=false; } } } public class App { public static void main(String[] args) { Graph graph = new Graph(); graph.addVertex('A'); graph.addVertex('B'); graph.addVertex('C'); graph.addVertex('D'); graph.addVertex('E'); graph.addEdge(0,1); graph.addEdge(1,2); graph.addEdge(0,3); graph.addEdge(3,4); System.out.println("Visits:"); graph.bfs(); System.out.println(); } }
MST
package org.exam.ch13.mst;
/**
* Created by xin on 15.10.18.
*/
class StackX {
private final int SIZE = 20;
private int[] st;
private int top;
public StackX() {
st = new int[SIZE];
top = -1;
}
public void push(int j) {
st[++top] = j;
}
public int pop() {
return st[top--];
}
public int peek() {
return st[top];
}
public boolean isEmpty() {
return (top == -1);
}
}
class Vertex{
public char label;
public boolean wasVisited;
public Vertex(char label) {
this.label = label;
}
}
class Graph{
private final int MAX_VERTS=20;
private Vertex[] vertexList;
private int[][] adjMat;
private int nVerts;//默认值为0
private StackX stackX;
public Graph(){
vertexList=new Vertex[MAX_VERTS];//里面元素为空
adjMat=new int[MAX_VERTS][MAX_VERTS];//元素默认值都为0
stackX=new StackX();
}
public void addVertex(char label){
vertexList[nVerts++]=new Vertex(label);
}
public void addEdge(int start,int end){
adjMat[start][end]=1;
adjMat[end][start]=1;
}
public void displayVertex(int index){
System.out.print(vertexList[index].label);
}
public int getAdjUnvisitedVertex(int v){
for (int i = 0; i < nVerts; i++) {
if (adjMat[v][i]==1&&vertexList[i].wasVisited==false){
return i;
}
}
return -1;
}
public void mst(){
vertexList[0].wasVisited=true;
stackX.push(0);
while (!stackX.isEmpty()){
int curVertex=stackX.peek();
int v=getAdjUnvisitedVertex(curVertex);
if (v==-1){
stackX.pop();
}else{
vertexList[v].wasVisited=true;
displayVertex(curVertex);
displayVertex(v);
System.out.print(" ");
stackX.push(v);
}
}
for (int i = 0; i < nVerts; i++) {
vertexList[i].wasVisited=false;
}
}
}
public class App {
public static void main(String[] args) {
Graph graph = new Graph();
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
graph.addVertex('D');
graph.addVertex('E');
graph.addEdge(0,1);
graph.addEdge(0,2);
graph.addEdge(0,3);
graph.addEdge(0,4);
graph.addEdge(1,2);
graph.addEdge(1,3);
graph.addEdge(1,4);
graph.addEdge(2,3);
graph.addEdge(2,4);
graph.addEdge(3,4);
System.out.print("Minimum spanning tree: ");
graph.mst(); // minimum spanning tree
System.out.println();
}
}
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- POJ1523 SPF dfs
- poj1731 Orders dfs
- Surrounded Regions
- Word Ladder, Gray Code
- Binary Tree Zigzag Level Order Traversal,Restore IP Addresses,Word Search,Simplify Path
- UVA 11624
- DFS求岛的个数LeetCode 200. Number of Islands
- 你不知道的JavaScript--Item21 漂移的this