`
kongshanxuelin
  • 浏览: 926953 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

图论—深度优先和广度优先算法源码

阅读更多

最近由于项目需要,需要实现深度优先和广度优先算法,图论中的基础内容,源代码共享一下,希望对大家有用:

public class Graph {
	private final int MAX_VERT=500;
	private Node nodelist[];
	private int adjMat[][];
	private int nverts;
	private Stack theStack;
	private Queue theQuene;
	
	public Graph(){
		//顶点数组
		nodelist=new Node[MAX_VERT];
		//邻接矩阵
		adjMat = new int[MAX_VERT][MAX_VERT];
		nverts=0;
		for(int i=0;i<MAX_VERT;i++){
			for(int j=0;j<MAX_VERT;j++){
				adjMat[i][j]=0;
			}
		}
		theStack=new Stack();
		theQuene=new LinkedList();
		sortedArray = new BusSiteBean[MAX_VERT];
	}
	
	/**
	 * 增加一定点
	 * @param node
	 */
	public void addNode(Node node){
		nodelist[nverts++]=node;
	}
	
	/**
	 * 增加一边
	 * @param start
	 * @param end
	 */
	public void addEdge(int start,int end){
		adjMat[start][end]=1;
		//有向图
		//adjMat[end][start]=1;
	}
	
	public int getAdjUnVisited(int v){
		for(int j=0;j<nverts;j++){
			if(adjMat[v][j]==1&&nodelist[j].isWasVisited()==false){
				return j;
			}
		}
		return -1;
	}
	
	/**
	 * 深度优先搜索算法
	 */
	public void dfs(){
		nodelist[0].setWasVisited(true);
		displayNode(0);
		theStack.push(0);
		while(!theStack.isEmpty()){
			int v=((Integer)theStack.peek()).intValue();
			v=getAdjUnVisited(v);
			
			if(v==-1){
				theStack.pop();
			}else{
				nodelist[v].setWasVisited(true);
				displayNode(v);
				theStack.push(v);
			}
		}
		for(int j=0;j<nverts;j++){
			nodelist[j].setWasVisited(false);
		}
	}
	
	/**
	 * 广度优先搜索算法
	 */
	public void bfs(){
		this.nodelist[0].setWasVisited(true);
		this.displayNode(0);
		this.theQuene.add(0);
		int v2;
		while(!this.theQuene.isEmpty()){
			int v1=((Integer)this.theQuene.remove()).intValue();
			while((v2=this.getAdjUnVisited(v1))!=-1){
				this.nodelist[v2].setWasVisited(true);
				displayNode(v2);
				this.theQuene.add(v2);
			}
		}
		for(int j=0;j<nverts;j++){
			nodelist[j].setWasVisited(false);
		}		
	}
	
	private int noSuccessors(){
		boolean isEdge;
		for(int row=0;row<this.nverts;row++){
			isEdge=false;
			for(int col=0;col<this.nverts;col++){
				if(adjMat[row][col]>0){
					isEdge=true;
					break;
				}
			}
			if(!isEdge)
				return row;
		}
		return -1;
	}
	
	/**
	 * 有向图拓扑
	 */
	public void poto(){
		int orig_nverts=this.nverts;
		while(this.nverts>0){
			int currentNode=noSuccessors();
			if(currentNode==-1){
				System.out.println("Graph 有环");
				return;
			}
			sortedArray[this.nverts-1]=nodelist[currentNode].getBs();
			deleteNode(currentNode);
		}
		for(int j=0;j<orig_nverts;j++){
			System.out.print(sortedArray[j]);
		}
	}
	
	private void deleteNode(int delVert){
		if(delVert!=this.nverts-1){
			for(int j=delVert;j<this.nverts-1;j++)
				this.nodelist[j]=this.nodelist[j+1];
			for(int row=delVert;row<this.nverts-1;row++)
				moveRowUp(row,this.nverts);
			for(int col=delVert;col<this.nverts-1;col++)
				moveRowLeft(col,this.nverts-1);
		}
		this.nverts--;		
	}
	private void moveRowUp(int row,int length){
		for(int col=0;col<length;col++)
			adjMat[row][col]=adjMat[row+1][col];
	}
	
	private void moveRowLeft(int col,int length){
		for(int row=0;row<length;row++)
			adjMat[row][col]=adjMat[row][col+1];	
	}

	public void displayNode(int v){
		System.out.println(nodelist[v].getBs().toString());
	}
	
	public static void main(String[] args) {
		Graph g=new Graph();
		g.addNode(new Node(new BusSiteBean("A")));
		g.addNode(new Node(new BusSiteBean("B")));
		g.addNode(new Node(new BusSiteBean("C")));
		g.addNode(new Node(new BusSiteBean("D")));
		g.addNode(new Node(new BusSiteBean("E")));
		g.addNode(new Node(new BusSiteBean("F")));
		g.addNode(new Node(new BusSiteBean("G")));
		g.addNode(new Node(new BusSiteBean("H")));
		
		g.addEdge(0, 3);
		g.addEdge(0, 4);
		g.addEdge(1, 4);
		g.addEdge(2, 5);
		g.addEdge(3, 6);
		g.addEdge(4, 6);
		g.addEdge(5, 7);
		g.addEdge(6, 7);
		
		g.poto();
	}
}
 
分享到:
评论
3 楼 kongshanxuelin 2008-10-07  
wuxuping 写道

你好 你是宁波的吗

是的
2 楼 wuxuping 2008-10-06  
你好 你是宁波的吗
1 楼 Element&lina 2008-10-06  
还不错,谢谢分享

相关推荐

    MATLAB源码集锦-基于BFS广度优先搜索算法代码

    本资源“MATLAB源码集锦-基于BFS广度优先搜索算法代码”是专门为MATLAB用户提供的,旨在帮助他们理解和实现BFS算法。 BFS算法的基本思想是从起点开始,首先访问其所有邻居,然后访问这些邻居的邻居,以此类推,直到...

    【三维路径规划】基于matlab广度优先搜索算法无人机三维路径规划【含Matlab源码 270期】.zip

    这个项目采用了一种名为广度优先搜索(BFS)的算法,这是一种在图论和计算机科学中广泛使用的搜索策略。接下来,我们将深入探讨广度优先搜索算法以及如何在三维空间中应用它来规划无人机的飞行路径。 首先,广度...

    计算机网络路由算法 源码图论

    例如,通过图的遍历算法(如深度优先搜索或广度优先搜索)来模拟数据包的传播,找出网络中的瓶颈或潜在问题。 压缩包内的“路由算法”文件可能包含了不同路由算法的实现源代码,这为我们提供了学习和研究的机会。...

    图论算法及应用_matlab算法实例源码.rar

    2. **遍历算法**:包括深度优先搜索(DFS)和广度优先搜索(BFS)。DFS用于寻找图中的路径,而BFS则常用于寻找最短路径或最小生成树问题。在MATLAB中,可以通过递归或队列实现这两种遍历。 3. **最短路径算法**:...

    c++ 深度优先 源程序

    深度优先搜索是图论和树结构中的一种遍历策略,它深入探索树或图的分支,尽可能深地搜索树的分支,直到找到解决方案或者回溯到没有其他分支可走为止。 迷宫问题是一个经典的图论问题,通常可以用二维数组或者邻接...

    图论算法软件_matlab源码.rar

    5. 连通性检测:通过深度优先搜索(DFS)或广度优先搜索(BFS)来判断图是否连通,以及找出连通分量。 6. 桥与割点:桥是指删除后会导致图不连通的边,割点是删除后会增加连通分量数的顶点。识别桥和割点有助于理解...

    源代码_matlab_图论算法_源码实现_

    7. 图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)是图遍历的两种基本策略,用于访问图的所有顶点。MATLAB中可以自定义函数实现这两种遍历方法。 通过学习并理解这些算法的MATLAB实现,不仅可以加深对图论的...

    深度搜索和广度搜索 C版本

    深度搜索(Depth First Search, DFS)和广度搜索(Breadth First Search, BFS)是图论和树形结构中常用的两种遍历算法,它们在计算机科学中有着广泛的应用,如解决路径查找、拓扑排序、最短路径等问题。本文将详细...

    java算法大全源码

    3. **搜索算法**:搜索算法包括顺序搜索、二分查找、深度优先搜索(DFS)、广度优先搜索(BFS)等。这些算法在解决查找问题时有重要作用,源码会展示它们的执行流程和优化技巧。 4. **图论算法**:图论在许多复杂...

    《妙趣横生的算法》源代码

    在源码中,你可以找到各种经典算法的实现,包括但不限于排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、搜索算法(如二分查找、深度优先搜索、广度优先搜索等)、图论算法(如最短路径...

    数学建模源码资料 MATLAB图论算法源码 共8个分类.rar

    在MATLAB中,可以通过邻接矩阵或邻接表表示图,并利用深度优先搜索(DFS)或广度优先搜索(BFS)判断图是否连通。 3. **匹配问题**: 匹配问题关注的是在图中找到尽可能多的非相交边集,使得每条边的两端都未被其他边...

    图论相关算法matlab源程序代码

    2. **图遍历算法**:图遍历是指遍历图中的所有节点,常见的有深度优先搜索(DFS)和广度优先搜索(BFS)。DFS适合寻找连通性,BFS则常用于找最短路径。这些算法在数据结构和算法中占有重要地位,可用于搜索、求解迷宫等...

    C#算法打包 算法类库 近百套C#源码 微软公司内部程序员培训算法大全 源码

    C#算法类库涵盖了排序算法(如快速排序、归并排序、冒泡排序、插入排序)、搜索算法(如二分查找、广度优先搜索、深度优先搜索)、图论算法(如最短路径算法Dijkstra、拓扑排序)、动态规划、贪心算法等多种类型,...

    c常用算法源码详细揭示了c的简单算法

    4. **图论算法**:包括深度优先搜索(DFS)和广度优先搜索(BFS),以及Dijkstra算法、Floyd-Warshall算法等,用于解决网络、路由和最短路径问题。 5. **字符串处理**:C语言中的KMP算法用于字符串匹配,Trie树用于...

    算法设计与分析(第二版)程序源码

    分支限界法通常采用广度优先搜索或深度优先搜索策略,并结合优先队列来控制搜索方向。 压缩包中的程序源码提供了实际的实现示例,可以帮助学习者深入理解上述算法的逻辑和运行过程。通过阅读和分析这些代码,学生...

    深度优先搜索算法Matlab源码_matlab源码.rar

    深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法,其基本思想是从起点开始,尽可能深地探索图的分支,直到达到叶子节点或回溯到一个未被访问的邻接节点。在Matlab中实现DFS可以帮助解决...

    N多个个经典c语言源码和c算法

    在压缩包中,可能包含了排序算法(如快速排序、归并排序、堆排序)、搜索算法(如二分查找、广度优先搜索、深度优先搜索)、数据结构(如链表、树、图、哈希表)的实现。学习这些算法,不仅可以提升我们的编程技能,...

    算法源码大全,很多的哟

    其次,搜索算法也是必不可少的部分,比如二分查找、深度优先搜索(DFS)和广度优先搜索(BFS)。这些搜索算法在处理大量数据时能大大提高效率,例如在有序数组中查找特定元素,或者在图或树结构中遍历节点。 此外,...

    Java算法大全源码包开源源码

    图论算法也是源码包中可能包含的内容,例如深度优先搜索(DFS)和广度优先搜索(BFS)用于遍历图或树结构,Dijkstra算法和A*算法用于求解最短路径问题,Floyd-Warshall算法用于求解所有顶点对间的最短路径。...

    算法_4_源码

    图论部分可能涵盖深度优先搜索(DFS)和广度优先搜索(BFS),以及最小生成树(Prim或Kruskal算法)、最短路径(Dijkstra算法或Floyd-Warshall算法)等。这些算法在解决实际问题,如网络路由、社交网络分析等方面有...

Global site tag (gtag.js) - Google Analytics