zoukankan      html  css  js  c++  java
  • 怎样实现广度优先遍历(BFS)

    BFS过程:

    一:訪问顶点V,并标记V为已经訪问

    二:顶点V入队列

    三:假设队列非空。进行运行,否则算法结束

    四:出队列取得对头顶点u,假设顶点未被訪问,就訪问该顶点,并标记该顶点为已经訪问

    五:查找u的第一个邻接节点w

    六:假设w不存在。则转到步骤三,否则循环运行

    a. 假设w没有被訪问过。则先把w入队列

    b.查找顶点u的下一个邻接节点,记为w,并转到步骤六


    上图使用BFS訪问顺序为:

    A BEDC


    队列的变化步骤例如以下:

    A

    B

    BE

    ED

    D

    C

    代码例如以下:

    #include<iostream>
    using namespace std;
    #define VertexSize 10
    int visit[VertexSize];
    
    //===================================
    #define QueueSize 30
    typedef struct 
    {
    	int Seq[QueueSize];
    	int front;
    	int rear;
    	int count;
    }RQueue;
    
    RQueue Q;
    
    void Initiate_Queue(RQueue *Q)
    {
    	Q->front=0;
    	Q->rear=0;
    	Q->count=0;
    }
    
    void AppendQueue(RQueue *Q,int data)
    {
    	if(Q->count>=QueueSize)
    	{
    		cout<<"overflow"<<endl;
    		return ;
    	}
    	Q->Seq[Q->rear]=data;
    	Q->rear=(Q->rear+1)%QueueSize;
    	Q->count++;
    }
    
    int QueueNotEmpty(RQueue *Q)
    {
    	if(Q->count!=0)
    		return 1;
    	else 
    		return 0;
    }
    
    int DeleteQueue(RQueue *Q)
    {
    	if(Q->count<=0)
    	{
    		cout<<"empty"<<endl;
    		return NULL;
    	}
    	int d;
    	d=Q->Seq[Q->front];
    	Q->front=(Q->front+1)%QueueSize;
    	Q->count--;
    	return  d;
    }
    
    
    
    //===================================
    
    
    typedef struct
    {
    	int weight[VertexSize][VertexSize];
    }Graph;
    
    
    void Initiate_Graph(Graph *g,int n)
    {
    	int i,j;
    	for(i=0;i<n;i++)
    		visit[i]=0;
    		for(j=0;j<n;j++)
    		{
    			if(i==j) g->weight[i][j]=0;
    			else g->weight[i][j]=0x7fff;
    		}
    }
    
    void InsertEdge(Graph *g,int v,int w,int weight,int n)
    {
    	if(v<0 || v>=n||w<0||w>=n)
    	{
    		cout<<"overflow!========="<<endl;
    	}
    	g->weight[v][w]=weight;
    }
    
    
    void dfs(Graph *g,int u,int n)
    {
    	cout<<u<<" ";
    	visit[u]=1;
    	int i;
    	for(i=0;i<n;i++)
    	{
    		if(g->weight[u][i]>0 && g->weight[u][i]<0x7fff && !visit[i])
    		{
    			visit[i]=1;
    			dfs(g,i,n);
    		}
    	}
    }
    
    void bfs(Graph *g,int u,int n)
    {
    	Initiate_Queue(&Q);
    	int j;
    	cout<<u<<" ";
    	visit[u]=1;
    	AppendQueue(&Q,u);
    	while(QueueNotEmpty(&Q))
    	{
    		int x=DeleteQueue(&Q);
    		for(j=0;j<n;j++)
    		{
    			if(g->weight[x][j]>0 &&g->weight[x][j]<0x7fff && !visit[j])
    			{
    				cout<<j<<" ";
    				visit[j]=1;
    				AppendQueue(&Q,j);
    			}
    		}
    	}
    }
    
    
    
    
    void main()
    {
    	Graph g;
    	int n,edge;
    	cout<<"请输入图的顶点个数:"<<endl;
    	cin>>n;
    	cout<<"请输入图的边个数"<<endl;
    	cin>>edge;
    	Initiate_Graph(&g,n);
    	int i,p1,p2,weight;
    	cout<<"请输入顶点-顶点-权值:"<<endl;
    	for(i=0;i<edge;i++)
    	{
    		cin>>p1>>p2>>weight;
    		InsertEdge(&g,p1,p2,weight,n);
    	}
    	cout<<"深度优先遍历为:"<<endl;
    	dfs(&g,0,n);
    	cout<<endl;
    	for(i=0;i<n;i++)
    		visit[i]=0;
    	cout<<"广度优先遍历为:"<<endl;
    	bfs(&g,0,n);
    	cout<<endl;
    	system("pause");
    }


  • 相关阅读:
    ubuntu: 环境搭建
    [转]unable to resolve superclass of 的奇怪问题和一种解决方法!
    [转]如何利用ndk-stack工具查看so库的调用堆栈【代码示例】?
    [转]TCP、UDP数据包大小的确定
    [转]教大家如何打造使用Tcpview(tcp查看器
    [转]帐号登录事件(事件编号与描述)
    [转]一个基于完成端口的TCP Server Framework,浅析IOCP
    [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
    mysql5.5 Replication 主从同步
    [转]adb pull Permission denied及no such file错误
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6792338.html
Copyright © 2011-2022 走看看