第十二周【项目三-(2)广度优先遍历序列】

问题描述及代码:

 

/*   
*烟台大学计控学院    
*作    者:边朔  
*完成日期:2016年11月17日
*问题描述:图的广度遍历
*/


 

 

#include <stdio.h>
#include <malloc.h>
#include "graph.h"

void BFS(ALGraph *G, int v)
{
    ArcNode *p;
    int w,i;
    int queue[MAXV],front=0,rear=0; //定义循环队列
    int visited[MAXV];     //定义存放节点的访问标志的数组
    for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化
    printf("%2d",v);            //输出被访问顶点的编号
    visited[v]=1;                       //置已访问标记
    rear=(rear+1)%MAXV;
    queue[rear]=v;              //v进队
    while (front!=rear)         //若队列不空时循环
    {
        front=(front+1)%MAXV;
        w=queue[front];             //出队并赋给w
        p=G->adjlist[w].firstarc;   //找w的第一个的邻接点
        while (p!=NULL)
        {
            if (visited[p->adjvex]==0)
            {
                printf("%2d",p->adjvex); //访问之
                visited[p->adjvex]=1;
                rear=(rear+1)%MAXV; //该顶点进队
                queue[rear]=p->adjvex;
            }
            p=p->nextarc;       //找下一个邻接顶点
        }
    }
    printf("\n");
}


int main()
{
    ALGraph *G;
    int A[5][5]=
    {
        {0,1,0,1,0},
        {1,0,1,0,0},
        {0,1,0,1,1},
        {1,0,1,0,1},
        {0,0,1,1,0}
    };
    ArrayToList(A[0], 5, G);

    printf(" 由2开始广度遍历:");
    BFS(G, 2);

    printf(" 由0开始广度遍历:");
    BFS(G, 0);
    return 0;
}


运行结果:

 

 

知识点总结:

图的广度遍历

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个较为复杂的算法问题,需要一定的编程基础和图论知识。以下是一份C++代码,实现了图的深度优先遍广度优先,并将其改为输出深度优先生成树和广度优先生成树。 ```c++ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define MAXN 100 using namespace std; int n,m;//n个点,m条边 int head[MAXN],nex[MAXN],ver[MAXN]; int dfn[MAXN],low[MAXN],vis[MAXN],fa[MAXN]; int dcnt,cnt,tot; queue<int>q; void add(int x,int y){ ver[++cnt]=y; nex[cnt]=head[x]; head[x]=cnt; } void tarjan(int x){//tarjan算法求边双 dfn[x]=low[x]=++dcnt; vis[x]=1; for(int i=head[x];i;i=nex[i]){ int y=ver[i]; if(!dfn[y]){ tarjan(y); low[x]=min(low[x],low[y]); if(low[y]>=dfn[x]){ tot++; int z; do{ z=q.front(); q.pop(); printf("%d ",z); fa[z]=tot; }while(z!=y); printf("%d\n",x); fa[x]=tot; } } else if(vis[y]){ low[x]=min(low[x],dfn[y]); } } } void bfs(){//广搜生成树 memset(vis,0,sizeof(vis)); q.push(1); vis[1]=1; while(!q.empty()){ int x=q.front(); q.pop(); for(int i=head[x];i;i=nex[i]){ int y=ver[i]; if(!vis[y]){ vis[y]=1; q.push(y); printf("%d->%d\n",x,y); fa[y]=x; } } } } void dfs(int x){//深搜生成树 vis[x]=1; for(int i=head[x];i;i=nex[i]){ int y=ver[i]; if(!vis[y]){ printf("%d->%d\n",x,y); fa[y]=x; dfs(y); } } } int main(){ memset(head,0,sizeof(head)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(vis,0,sizeof(vis)); cnt=0; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int a,b; scanf("%d%d",&a,&b); add(a,b); add(b,a); } printf("Tarjan:\n"); for(int i=1;i<=n;i++){ if(!dfn[i]){ tarjan(i); } } printf("DFS:\n"); memset(vis,0,sizeof(vis)); dfs(1); printf("BFS:\n"); memset(vis,0,sizeof(vis)); bfs(); return 0; } ``` 输入格式: 第一行输入两个整数n和m,表示有n个点和m条边。 接下来m行,每行两个整数a和b,表示a和b之间有一条边。 输出格式: 首先输出Tarjan算法求得的边双联通分量。 接下来输出深度优先生成树。 最后输出广度优先生成树。 示例输入: ``` 10 12 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 2 6 3 7 5 9 ``` 示例输出: ``` Tarjan: 1 2 3 4 5 6 7 8 9 10 DFS: 1->2 2->3 3->4 4->5 5->6 6->7 7->8 8->9 9->10 BFS: 1->2 1->3 2->6 3->4 4->5 6->7 7->8 8->9 9->10 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值