• 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历



    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)

    输入

    输入第一行为整数n(0< n <100),表示数据的组数。
    对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m条边,k个顶点,t为遍历的起始顶点。
    下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

    输出

    输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。

    示例输入

    1
    6 7 0
    0 3
    0 4
    1 4
    1 5
    2 3
    2 4
    3 5
    

    示例输出

    0 3 4 2 5 1

    代码1:
     1 #include<stdio.h>//用bfs遍历无向图邻接矩阵
     2 #include<string.h>
     3 int map[101][101];
     4 int vis[101],que[101];//建立标记数组和队列
     5 int m,k,t,flag;
     6 void bfs(int t)
     7 {
     8     int l=0,r=0;
     9     int i,j;
    10     //r变量只跟随着队列走
    11     que[r]=t;
    12     r++;//r在这里是1
    13     for(i=0;i<k;i++)//循环r次,r的值会随着循环体中的语句而变化,这里应该可以把r改成k,因为最终r会等于k
    14     {
    15         l++;//l的作用是保存住头下标,实际上已经变成了头下标+1,同时也代表着已经输出的元素个数
    16         for(j=0;j<k;j++)//k是节点数
    17         {
    18             if(!vis[j]&&map[que[l-1]][j])//que[l-1]在这里指的是上一次头下标
    19             {
    20                 que[r]=j;//让和l-1邻接的元素下表全部入队列
    21                 r++;//r控制着整体的大循环
    22                 vis[j]=1;//vis[j]==1代表与l-1邻接的元素已经访问完
    23             }
    24         }
    25     }
    26 }
    27 int main()
    28 {
    29     int h,n,i,u,v;
    30     scanf("%d",&n);
    31     for(h=1;h<=n;h++)
    32     {
    33         memset(vis,0,sizeof(vis));
    34         memset(map,0,sizeof(map));
    35         scanf("%d%d%d",&k,&m,&t);//t是遍历的起点
    36         for(i=0;i<m;i++)//建立无向图邻接矩阵
    37         {
    38             scanf("%d%d",&u,&v);
    39             map[u][v]=1;
    40             map[v][u]=1;
    41         }
    42         flag=1;
    43         vis[t]=1;//让标记数组中的t下标数组元素等于1
    44         bfs(t);//从t开始遍历,并保存进队列que
    45         //输出队列中的元素
    46         for(i=0;i<k;i++)
    47         if(i==0)printf("%d",que[i]);
    48         else printf(" %d",que[i]);
    49         printf("
    ");
    50     }
    51     return 0;
    52 }
    View Code

     代码2:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<queue>
     6 using namespace std;
     7 int m,n,k;
     8 int map[101][101],visited[1001];
     9 int sttr(const void *a,const void *b)
    10 {
    11     return *(int *)a-*(int *)b;
    12 }
    13 void fbs()
    14 {
    15     cout<<k;
    16     visited[k]=1;
    17     queue<int>que;
    18     que.push(k);
    19     while(!que.empty())
    20     {
    21         int f[1000];
    22         int t=0;
    23         k=que.front();
    24         que.pop();
    25         int i;
    26         for(i=0; i<=m-1; i++)
    27             if(map[k][i]==1&&visited[i]==0)
    28             {
    29                 visited[i]=1;
    30                 f[t++]=i;
    31             }
    32         qsort(f,t,sizeof(f[0]),sttr);
    33         for(i=0; i<=t-1; i++)
    34         {
    35             que.push(f[i]);
    36             cout<<" "<<f[i];
    37         }
    38     }
    39     cout<<endl;
    40 }
    41 int main()
    42 {
    43     int zong;
    44     cin>>zong;
    45     while(zong--)
    46     {
    47         cin>>m>>n>>k;
    48         memset(map,0,sizeof(map));
    49         memset(visited,0,sizeof(visited));
    50         int i;
    51         for(i=1;i<=n;i++)
    52         {
    53             int u,v;
    54             cin>>u>>v;
    55             map[u][v]=1;
    56             map[v][u]=1;
    57         }
    58         fbs();
    59     }
    60     return 0;
    61 }
    View Code


  • 相关阅读:
    分布式机器学习:算法、理论与实践——【1】
    LLVM Cookbook
    【前端】Webpack 进阶
    Noip2015 运输计划 树上差分 二分答案
    bzoj 2259: [Oibh]新型计算机 最短路 建模
    888E
    [ZJOI2012]旅游 对偶图 树的直径
    [HAOI2007]理想的正方形 单调队列 暴力
    bzoj1457: 棋盘游戏 SG函数 Nim
    Bomb HDU
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3241592.html
Copyright © 2020-2023  润新知