数据结构实验之图论二:基于邻接表的广度优先搜索遍历

题目描述

给定一个无向连通图,顶点编号从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


#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#define max 100
using namespace std;
queue<int>q;//将访问过的节点保存到队列
typedef int element;
typedef struct arcnode//表结点结构
{
    element adj;//该弧所指向的顶点的位置
    arcnode *next;//指向下一条弧的指针
}arcnode;
typedef struct vnode//头结点结构
{
    element data;//顶点信息
    arcnode *first;;//指向第一条依附该顶点的弧的指针
}vnode,adjlist[max];
typedef struct //图的结构;
{
    adjlist a;
    int vn,an;//图的当前顶点数和弧数
}ALG;
element k;//初始顶点;
element i,j;
element create(ALG &g)
{
    element v1,v2;
    arcnode *p;
    scanf("%d%d%d",&g.vn,&g.an,&k);
    for(i=0;i<g.vn;i++)
        g.a[i].first=NULL;
    for(i=0;i<g.an;i++)
    {
        scanf("%d%d",&v1,&v2);
        p=new arcnode;
        p->adj=v2;
        p->next=g.a[v1].first;//逆序建立链表
        g.a[v1].first=p;
        //无向图的对称性
        p=new arcnode;
        p->adj=v1;
        p->next=g.a[v2].first;
        g.a[v2].first=p;
    }
    return 1;
}
element v[110];//当前要访问的节点
void bfs(ALG &g,element k)
{
    arcnode *p;
    memset(v,0,sizeof(v));//标记数组的初始化;
    v[k]=1;
    q.push(k);
    printf("%d",k);
    while(!q.empty())
    {
        i=q.front();
        q.pop();
        p=g.a[i].first;
        {
            while(p)//依次搜索vi的邻接点vj(p->adj相当于j)
            {
                if(!v[p->adj])
                {
                    v[p->adj]=1;
                    q.push(p->adj);
                    printf(" %d",p->adj);
                }
                p=p->next;
            }
        }
    }
}
void Swap(ALG &g)//保证(同一个结点的同层邻接点,节点编号小的优先遍历)
{
    element t;
    arcnode *p,*q;
    for(i=0;i<g.vn;i++)
      for(p=g.a[i].first;p;p=p->next)
        for(q=p->next;q;q=q->next)
           if(p->adj>q->adj)
            {
              t=p->adj;
                p->adj=q->adj;
                  q->adj=t;
            }


}
element main()
{
    element n;
    ALG g;
    scanf("%d",&n);
    while(n--)
    {
        create(g);//构建邻接表
        Swap(g);//邻接表排序
        bfs(g,k);//广度优先遍历
        printf("\n");
    }
    return 0;
}




#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
int map[110][110],vis[110];
void bfs(int t,int n)
{
  queue<int>q;
   int flag=1;
   q.push(t);
   vis[t]=1;
   while(!q.empty())
   {
      int p=q.front();
      q.pop();
      if(flag)
      {flag=0;printf("%d",p);}
      else
      printf(" %d",p);
      for(int i=0;i<n;i++)
      {if(!vis[i]&&map[i][p])
         {q.push(i);
          vis[i]=1;}
      }
   }
}
int main()
{


   int T;
   cin>>T;
   while(T--)
   {  memset(vis,0,sizeof(vis));
     memset(map,0,sizeof(map));
     int n,m,t;
     cin>>n>>m>>t;
     while(m--)
      {
        int v,u;
        cin>>u>>v;
       map[u][v]=map[v][u]=1;
     }
     bfs(t,n);
    }




}





#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
struct node
{int u,v;
  node *next;
}*head[22];
int vis[22],flag=1;
void add(int u,int v)//顺序建表;
{node *p=new node;
 p->v=v;
 p->next=head[u];
 head[u]=p;
}
int n,k,m;
//int b[110],x[110];
void bfs(int t)
{
   int p;
   queue<int>q;
   q.push(t);
   vis[t]=1;
   flag=1;
   while(!q.empty())
   {
     p=q.front();
     q.pop();
     if(flag)
     {flag=0,printf("%d",p);}
     else
     printf(" %d",p);
    for(node *h=head[p];h;h=h->next)
    {
      if(vis[h->v]==0)
      {
        q.push(h->v);
        vis[h->v]=1;
      }
    }
   }
}
int main()
{
  int i;
  int u,v,t;
   cin>>n;
   while(n--)
   {
     cin>>k>>m>>t;
     memset(head,NULL,sizeof(head));
     memset(vis,0,sizeof(vis));
     for(i=0;i<m;i++)
     {cin>>u>>v;
      add(u,v);
      add(v,u);
     }
     for(int i=0;i<m;i++)
     {
      node *p,*q;
      for(p=head[i];p;p=p->next)//对邻接链表排序
      {
         for(q=p->next;q;q=q->next)
         {
           if(p->v>q->v)
           swap(p->v,q->v);
         }
      }
     }
     bfs(t);
     printf("\n");
   }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO之打印流

打印流,打印数据的,打印流只能是输出流: PrintStream: 字节打印流 PrintWriter: 字符打印流 -对于PrintWriter来说,当启用字段刷新之后, 调用println或者printf或者format方法,便会立马刷新操作. 如果没有开启自动刷新,则需要手动刷新或者当缓冲区满的时候,再自动刷新. 使…

数据结构实验之查找四:二分查找

题目描述 在一个给定的无重复元素的递增序列里&#xff0c;查找与给定关键字相同的元素&#xff0c;若存在则输出找到的位置,不存在输出-1。 输入 一组输入数据&#xff0c;输入数据第一行首先输入两个正整数n ( n < 10^6 )和m ( m < 10^4 )&#xff0c;n是数组中数据元…

橡皮鸭程序调试法

转自&#xff1a;http://write.blog.csdn.net/postedit 面&#xff0c;让我来为你介绍一个程序调试大法——“橡皮鸭程序调试法”&#xff0c;这个方法在调试界是很出众的&#xff0c;实施起来相当方便和简易&#xff0c;几乎可以随时随地地实验&#xff0c;几乎不需要借助任何…

标准IO概述和操作

标准的IO: 标准的输入: 通过键盘录入数据给程序. 标准的输出: 在屏幕上显示程序数据. 在System类中有两个常量: InputStream in System.in; PrintStream out System.out; 标准流的重定向操作: 标准的输入: 通过键盘录入数据给程序. 重新指定输入的源不再是键盘,而是一个…

十条不错的编程观点

转自&#xff1a;http://coolshell.cn/articles/2424.html 在Stack Overflow上有这样的一个贴子《What’s your most controversial programming opinion?》&#xff0c;翻译成中文就是“你认为最有争议的编程观点是什么&#xff1f;”&#xff0c;不过&#xff0c;在400多个主…

数据结构上机实验之二分查找

题目描述 在一个递增的序列里&#xff0c;查找元素是否存在&#xff0c;若存在输出YES,不存在输出NO.输入 本题多组数据&#xff0c;首先输入一个数字n(n>100000)&#xff0c;然后输入n个数&#xff0c;数据保证数列递增&#xff0c;然后再输入一个查找数字。输出 若存在输出…

IO之 Properties类加载文件

配置文件:资源文件(以.properties作为拓展名的文件)/属性文件: 做项目开发,为何使用配置文件? 把所有的数据存储在代码中,写死了,”硬编码”. 比如:在Java中需要连接数据库,必须拥有数据的账号和密码. 此时我们就得在Java代码中编写,类似的代码: String username”root”…

Makefile系列学习(博客)

http://blog.csdn.net/haoel/article/category/9198/3

数据结构实验之查找六:顺序查找

题目描述 在一个给定的无序序列里&#xff0c;查找与给定关键字相同的元素&#xff0c;若存在则输出找到的元素在序列中的位序和需要进行的比较次数,不存在则输出"No"&#xff0c;序列位序从1到n,要求查找从最后一个元素开始,序列中无重复元素。 输入 连续多组数据输…

IO之数据流

数据流,提供了可以读/写任意数据类型的方法: DataOutputStream: 提供了 writeXxx(xxx value)方法. DataInputStream: 提供了 readXxx()方法. 注意: writeXxx和readXxx必须要对应起来, writeByte写出的数据,此时只能使用readByte读取回来.

可视化的状态机(FSM)

状态机这个概念已经在网上的博客和论坛中都已经说烂了&#xff0c;随便一搜都有一大堆。相关的废话就不多说了&#xff0c;在这里主要是分享一下如何可视化的设计状态机&#xff0c;如何增强项目的灵活性。这里通过一个生活中的电梯来了解一下状态机。 电梯逻辑如下图&#xf…

数据结构上机实验之顺序查找

题目描述 在一个的序列里&#xff0c;查找元素是否存在&#xff0c;若存在输出YES,不存在输出NO.输入 本题多组数据&#xff0c;首先输入一个数字n&#xff0c;然后输入n(n<1000)个数&#xff0c;然后再输入一个查找数字。输出 若存在输出YES,不存在输出NO.示例输入 4 1 3 5…

dll加载问题的解决方法

在使用LoadLibrary() 和LoadLibraryEx()加载dll文件的时候&#xff0c;会产生下面的错误&#xff1a; this application has failed to start because XXXXX.dll was not found. Re-installing the application may fix this problem. 其中xxxxx是你所调用的dll的文件名。 这类…

IO之 随机访问文件(RandomAccessFile)

随机访问文件(RandomAccessFile): 表示可以在该文件的任何位置写出和读取数据. API中文解释&#xff1a; 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引&#xff0c;称为文件指针&…

数据结构实验之排序二:交换排序

题目描述 冒泡排序和快速排序都是基于"交换"进行的排序方法&#xff0c;你的任务是对题目给定的N个&#xff08;长整型范围内的&#xff09;整数从小到大排序&#xff0c;输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。 输入 连续多组输入数据&#xff…

关于通过dll导出类模板和函数模板

动态链接库中导出模板函数 C 支持函数模板&#xff0c;利用函数模板&#xff0c;可以简化我们的程序代码。我在自己的代码中也经常用到函数模板&#xff0c;但是以前一直以为函数模板是要放到头文件中的&#xff0c;否则调用模板函数时&#xff0c;编译器会找不到函数模板的定义…

数据结构实验之排序三:bucket sort

题目描述 根据人口普查结果&#xff0c;知道目前淄博市大约500万人口&#xff0c;你的任务是帮助人口普查办公室按年龄递增的顺序输出每个年龄有多少人&#xff0c;其中不满1周岁的按0岁计算&#xff0c;1到2周岁的按1岁计算&#xff0c;依次类推&#xff0c;大于等于100岁的老…

C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

模板的实例化指函数模板&#xff08;类模板&#xff09;生成模板函数&#xff08;模板类&#xff09;的过程。对于函数模板而言&#xff0c;模板实例化之后&#xff0c;会生成一个真正的函数。而类模板经过实例化之后&#xff0c;只是完成了类的定义&#xff0c;模板类的成员函…

交叉排序

题目描述 输入N个数&#xff0c;把所有奇数位置上的数从小到大排序&#xff0c;把偶数位置上的数从大到小排序。输入 输入的第一行是一个正整数N(2<N<100)。 第二行是N个用空格隔开的整数。输出 输出只有一行N个数&#xff0c;是按要求排序后的序列&#xff0c;用空格隔开…

c++模板显示实例化,显示具体化,隐式实例化

函数模板是C新增的一种性质&#xff0c;它允许只定义一次函数的实现&#xff0c;即可使用不同类型的参数来调用该函数。这样做可以减小代码的书写的复杂度&#xff0c;同时也便于修改&#xff08;注&#xff1a;使用模板函数并不会减少最终可执行程序的大小&#xff0c;因为在调…