无项无权图的基本操作

package cn.ccnu.graph;

public class BDFSGraphApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Graph theGraph=new Graph();
		theGraph.addVertex('A');
		theGraph.addVertex('B');
		theGraph.addVertex('C');	
		theGraph.addVertex('D');		
		theGraph.addVertex('E');
		
		theGraph.addEdge(0, 1);//AB
		theGraph.addEdge(1, 2);//BC
		theGraph.addEdge(0, 3);//AC
		theGraph.addEdge(3, 4);//CD
		
		System.out.print("visits: ");
		theGraph.dfs();
		System.out.println();
		System.out.print("visits: ");
		theGraph.bfs();
		System.out.println();
		theGraph.mst();
		System.out.println();
		
	}

}

class StackX{
	private final int SIZE=20;
	private int[] st;
	private int top;
	
	public StackX(){
		st=new int[20];
		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 Queue{
	private final int SIZE=20;
	private int[] queArray;
	private int front;
	private int rear;
	int num=0;
	public Queue(){
		queArray=new int[SIZE];
		front=0;
		rear=-1;
	}
	
	public void insert(int j){
		if(rear==SIZE-1)
			rear=-1;
		queArray[++rear]=j;
		num++;
	}
	
	public int remove(){
		int temp=queArray[front++];
		num--;
		if(front==SIZE)
			front=0;
		return temp;
	}
	public boolean isEmpty(){
		return num==0;
	}
}

class Vertex{
	public char label;
	public boolean wasVisited;
	
	public Vertex(char label){
		this.label=label;
		wasVisited=false;
	}
}

class Graph{
	private final int MAX_VERTS=20;
	private Vertex[ ] vertexList;
	private int adjMat[ ][ ];
	private int nVerts;
	private StackX theStack;
	private Queue theQueue;
	
	public Graph(){
		vertexList=new Vertex[MAX_VERTS];
		adjMat=new int[MAX_VERTS][MAX_VERTS];
		nVerts=0;
		for(int i=0;i<MAX_VERTS;i++)
			for(int j=0;j<MAX_VERTS;j++)
				adjMat[i][j]=0;
		theStack=new StackX();
		theQueue=new Queue();
	}
	
	public void addVertex(char lab){
		vertexList[nVerts++]=new Vertex(lab);
	}
	
	public void addEdge(int start,int end){
		adjMat[start][end]=1;
		adjMat[end][start]=1;
	}
	
	public void displayVertex(int v){
		System.out.print(vertexList[v].label);
	}
	/**
	 * 深度优先遍历
	 * */
	public void dfs(){
		vertexList[0].wasVisited=true;
		displayVertex(0);
		theStack.push(0);
		while(!theStack.isEmpty()){
			int v=getAdjUnvisitedVertex(theStack.peek());
			if(v==-1)
				theStack.pop();
			else{
				vertexList[v].wasVisited=true;
				displayVertex(v);
				theStack.push(v);
			}
		}
		for(int i=0;i<nVerts;i++){
			vertexList[i].wasVisited=false;
		}
	}
	/**
	 * 广度优先遍历
	 * */
	public void bfs(){
		theQueue.insert(0);
		displayVertex(0);
		vertexList[0].wasVisited=true;
		int v2;
		while(!theQueue.isEmpty()){
			int v1=theQueue.remove();
			while((v2=getAdjUnvisitedVertex(v1))!=-1){
				theQueue.insert(v2);
				displayVertex(v2);
				vertexList[v2].wasVisited=true;
			}
		}
		for(int i=0;i<nVerts;i++){
			vertexList[i].wasVisited=false;
		}
	}
	/**
	 * 查找与v点相连但是并没有被访问过的节点
	 * */
	private int getAdjUnvisitedVertex(int v) {
		// TODO Auto-generated method stub
		for(int i=0;i<nVerts;i++){
			if(vertexList[i].wasVisited==false&&adjMat[v][i]==1)
				return i;
		}
		return -1;
	}
	
	/**
	 * 最小生成树
	 * */
	
	public void mst(){
		vertexList[0].wasVisited=true;
		theStack.push(0);
		
		while(!theStack.isEmpty()){
			int currentVertex=theStack.peek();
			int v=getAdjUnvisitedVertex(currentVertex);
			
			if(v==-1)
				theStack.pop();
			else{
				vertexList[v].wasVisited=true;
				theStack.push(v);

				displayVertex(currentVertex);
				displayVertex(v);
				System.out.print(" ");
			}
		}
		for(int j=0;j<nVerts;j++){
			vertexList[j].wasVisited=false;
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值