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

来源:互联网 发布:王牌特工知乎 编辑:程序博客网 时间:2024/05/29 16:01

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

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的遍历结果。

示例输入

16 7 00 30 41 41 52 32 43 5

示例输出

0 3 4 2 5 1

提示

用邻接表存储。

来源

 

示例程序

 
view plaincopyprint如果您复制代码时出现行号,请点击左边的“view plain”后再复制
  1. #include<stdio.h>  
  2. #include<string.h>  
  3.   
  4. int k, m, t;  
  5. int visit[200], b[200];  //visit是标记数组;b数组用来存放搜索的点,每次搜索一遍经排序后就输出
  6.   
  7. struct node  
  8. {  
  9.     int u, v;  
  10.     node *next;  
  11. }*head[200];  //;邻接表
  12.   
  13. void add(int u, int v)  
  14. {  
  15.     node *p=new node;  
  16.     p->u=u;  
  17.     p->v=v;  
  18.     p->next=head[u];  
  19.     head[u]=p;  
  20. }  
  21.   
  22. void bfs(int t)  
  23. {  
  24.     node *p=new node;  
  25.     visit[t]=1;  
  26.     p=head[t];  
  27.     int s=1;  
  28.     while(p)  
  29.     {  
  30.         if(visit[p->v]==0)  
  31.         {  
  32.             b[s++]=p->v;  
  33.             visit[p->v]=1;  
  34.             p=p->next;  
  35.         }  
  36.         else  
  37.         {  
  38.             p=p->next;  
  39.         }  
  40.     
  41.     for(int i=1;i<s;i++)  //用冒泡把每次搜索到的与同一个节点同层的邻接点从小到大排序
  42.     {  
  43.         for(int j=1;j<s-i;j++)  
  44.         {  
  45.             if(b[j]>b[j+1])  
  46.             {  
  47.                 int t;  
  48.                 t=b[j];  
  49.                 b[j]=b[j+1];  
  50.                 b[j+1]=t;  
  51.             }  
  52.         }  
  53.     }  
  54.     for(int i=1;i<s;i++)  //把每次搜索到的节点输出
  55.         printf(" %d", b[i]);  
  56.     for(int i=1;i<s;i++)  //广度优先搜索
  57.         bfs(b[i]);  
  58. }  
  59.   
  60. int main()  
  61. {  
  62.     int n, u, v;  
  63.     scanf("%d", &n);  
  64.     while(n--)  
  65.     {  
  66.         memset(visit,0,sizeof(visit));  
  67.         memset(head,NULL,sizeof(head));  
  68.         scanf("%d%d%d", &k, &m, &t);  
  69.         while(m--)  
  70.         {  
  71.             scanf("%d%d", &u, &v);  
  72.             add(u, v);  //add函数建立邻接表
  73.             add(v, u);  
  74.         }  
  75.         printf("%d", t);  //先把最先需要搜索的点输出,即遍历的起始点
  76.         bfs(t);  
  77.         printf("\n");  
  78.     }  
  79.     return 0;  
  80. }  
  81.    
0 0