zoukankan      html  css  js  c++  java
  • 数据结构快速回顾——图的遍历

    图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操作功能相似。图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上。
    图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法。

    深度优先搜索法DFS

    深度优先搜索法的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则退回到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点w,从w出发按同样的方法向前遍历,直到图中所有顶点都被访问。

    广度优先搜索法BFS

    图的广度优先搜索是树的按层次遍历的推广,它的基本思想是:首先访问初始点vi,并将其标记为已访问过,接着访问vi的所有未被访问过的邻接点vi1,vi2,…, vi t,并均标记已访问过,然后再按照vi1,vi2,…, vi t的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依次类推,直到图中所有和初始点vi有路径相通的顶点都被访问过为止。
    具体实现如下:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stack>
    #include <queue> 
    #define NODE_SIZE 	100
    
    
    typedef struct __GRAPH{
    
    	int	n;
    	int e;
    	int matrix[NODE_SIZE][NODE_SIZE];
    }Graph;
    
    //使用栈 递归式深度优先遍历 
    void DFS_0(Graph g, int v0, bool* visit)
    {
    	int i,j,k;
    	visit[v0] = true;
    	printf("visit %d	",v0);
    	
    	for(i =0; i <g.n; i++)
    	{
    		if(g.matrix[v0][i] != 0 && visit[i] == false)
    		{
    			DFS_0(g,i,visit); 
    		}
    	}	
    
    }
    
    //使用栈 非递归式深度优先遍历 
    void DFS(Graph g, int v0)
    {
    	bool *visit = new bool[g.n];
    	int i,j,k;
    	for( i =0;i < g.n; i++)
    	{
    		visit[i] = false;
    	}
    
    	visit[v0] = true;
    	printf("visit %d	",v0);
    	std::stack<int> s;
    	s.push(v0);
    	
    	while(!s.empty())
    	{
    		int tmpNode,i;
    		tmpNode = s.top();
    		
    		for(i =0; i <g.n; i++)
    		{
    			if(g.matrix[tmpNode][i] != 0 && visit[i] == false)
    			{
    				printf("visit %d	",i);
    				visit[i] = true;
    				s.push(i);
    				break;
    			}
    		}
    		if(i == g.n)
    			s.pop();
    	}
    }
    
    //使用栈 非递归式广度优先遍历 
    void BFS(Graph g, int v0)
    {
    	bool *visit = new bool[g.n];
    	int i,j,k;
    	for( i =0;i < g.n; i++)
    	{
    		visit[i] = false;
    	}
    
    	visit[v0] = true;
    	printf("visit %d	",v0);
    	std::queue<int> s;
    	s.push(v0);
    	
    	while(!s.empty())
    	{
    		int tmpNode,i;
    		tmpNode = s.front();
    		s.pop();
    		
    		for(i =0; i <g.n; i++)
    		{
    			if(g.matrix[tmpNode][i] != 0 && visit[i] == false)
    			{
    				printf("visit %d	",i);
    				visit[i] = true;
    				s.push(i);
    			}
    		}
    
    	}
    }
    
    int main()
    {
    	int m, n;
    
    	while(scanf("%d %d",&n,&m)!= EOF)
    	{
    		Graph g;
    		g.n = n;
    		g.e= m;
    
    		int *dist = (int*)calloc(n,sizeof(int));
    		int *path = (int*)calloc(n,sizeof(int));
    
    
    		memset(g.matrix,0,sizeof(int)*NODE_SIZE*NODE_SIZE); 
    
    		int s,t;//边的起点和终点 
    		for(int i =0; i <m; i++)
    		{
    			scanf("%d %d",&s,&t);
    			if(g.matrix[s][t] > 0)
    				continue;
    			g.matrix[s][t]=i+1;
    			g.matrix[t][s]=g.matrix[s][t];
    		}
    
    		DFS(g,0);
    		printf("
    DFS_0: 
    ");
    		
    		bool *visit = new bool[g.n];
    		for( int i =0;i < g.n; i++)
    		{
    			visit[i] = false;
    		}
    
    		DFS_0(g,0,visit);
    		printf("
    BFS_0: 
    ");
    		BFS(g,0);
    	}
    
    }
    

    测试用例:
    5	5
    0 	1
    0	2
    2 	4
    4	1
    1	3

    对应图为:
    
    
    参考:http://baike.baidu.com/view/8844138.htm
  • 相关阅读:
    架构基础-CAP原理
    Nginx基础
    Nginx基础
    Nginx基础
    Nginx基础
    Nginx基础
    Nginx基础
    Nginx基础
    CentOS 7 架设LNMP动态网站
    Linux下文件描述符
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/3804288.html
Copyright © 2011-2022 走看看