zoukankan      html  css  js  c++  java
  • 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

     

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

    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<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<queue>
     6 using namespace std;
     7 struct vode
     8 {
     9     int v;
    10     struct vode *next;
    11 };
    12 struct vode *f[10000];
    13 int m,n,k;
    14 int visited[1000001];
    15 void paixu(struct vode *head)
    16 {
    17     struct vode *q,*p;
    18     int k=0;
    19     while(k=!k)
    20     {
    21         p=head;
    22         q=p->next;
    23         while(q)
    24         {
    25             if(p->v>q->v)
    26             {
    27                 int t;
    28                 t=p->v;
    29                 p->v=q->v;
    30                 q->v=t;
    31                 k=0;
    32             }
    33             else
    34             {
    35                 p=p->next;
    36                 q=p->next;
    37             }
    38         }
    39     }
    40 }
    41 void fbs()
    42 {
    43     struct vode *p;
    44     visited[k]=1;
    45     queue<int>que;
    46     que.push(k);
    47     cout<<k;
    48     while(!que.empty())
    49     {
    50         k=que.front();
    51         que.pop();
    52         p=f[k];
    53         paixu(p);
    54         while(p)
    55         {
    56             if(visited[p->v]==0)
    57             {
    58                 cout<<" "<<p->v;
    59                 que.push(p->v);
    60                 visited[p->v]=1;
    61             }
    62             p=p->next;
    63         }
    64     }
    65     cout<<endl;
    66 }
    67 int main()
    68 {
    69     int zong;
    70     cin>>zong;
    71     while(zong--)
    72     {
    73         memset(visited,0,sizeof(visited));
    74         cin>>m>>n>>k;
    75         int i;
    76         for(i=1;i<=n;i++)
    77         {
    78             int u,v;
    79             cin>>u>>v;
    80             struct vode *p;
    81             p=(struct vode *)malloc(sizeof(struct vode));
    82             p->v=v;
    83             p->next=f[u];
    84             f[u]=p;
    85             p=(struct vode *)malloc(sizeof(struct vode));
    86             p->v=u;
    87             p->next=f[v];
    88             f[v]=p;
    89         }
    90         fbs();
    91     }
    92     return 0;
    93 }
    View Code

    代码2:与之前的相比,这个代码中排序方法有所改变。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<iostream>
     5 #include<queue>
     6 
     7 using namespace std;
     8 int vis[101];
     9 int n,m,k;
    10 queue<int>q;
    11 
    12 struct node
    13 {
    14     int u,v;
    15     struct node *next;
    16 }*head[110];
    17 
    18 void add(int u, int v)
    19 {
    20    struct node *p = (struct node*)malloc(sizeof(struct node));
    21    p->u = u;
    22    p->v = v;
    23    p->next = head[u];
    24    head[u] = p;
    25 };
    26 
    27 int cmp(const void *a,const void *b)
    28 {
    29     return *(int *)a-*(int *)b;
    30 }
    31 
    32 void bfs(int t)
    33 {
    34    int i,x,a[110],j,b[110],y;
    35    q.push(t);//元素t入队列
    36    vis[t]=1; j=0;
    37    while(!q.empty())//如果队列非空
    38    {
    39        x=q.front();
    40        a[++j]=x;
    41        q.pop();//删除队首元素
    42        y=0;
    43            for(struct node *p=head[x]; p!=NULL; p=p->next)
    44            {
    45                if(vis[p->v]==0)
    46                {
    47                    b[y++]=p->v;
    48                    vis[p->v]=1;
    49                }
    50            }
    51         if(y>=1)
    52         qsort(b,y,sizeof(b[0]),cmp);//快速排序,使得同一层次的节点按照从小到大排序
    53         for(i=0; i<=y-1; i++)
    54         q.push(b[i]);//让b数组中的元素依次由小到达入队列
    55    }
    56    for(i=1; i<=j-1; i++)
    57    printf("%d ",a[i]);
    58    printf("%d
    ",a[i]);
    59 };
    60 
    61 int main()
    62 {
    63     int t,i,u,v;
    64     scanf("%d",&n);
    65     while(n--)
    66     {
    67         memset(head,NULL,sizeof(head));
    68         memset(vis,0,sizeof(vis));
    69         cin>>k>>m>>t;
    70         for(i=0; i<m; i++)
    71         {
    72             cin>>u>>v;
    73             add(u,v);
    74             add(v,u);
    75         }
    76         bfs(t);
    77     }
    78 }
    View Code
    邻接表的结构示意:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 int m,n;
     5 int visited[300];
     6 struct vode
     7 {
     8     int v;
     9     struct vode *next;
    10 };
    11 int que[100];
    12 struct vode *f[300];
    13 void fbs(int k)
    14 {
    15     int i;
    16     for(i=0;i<=m-1;i++)
    17     {
    18         printf("%d : ",i);
    19         struct vode *p=f[i];
    20         for(;p;p=p->next)
    21         printf("%d ",p->v);
    22         printf("
    ");
    23     }
    24 }
    25 int main()
    26 {
    27     int sum;
    28     scanf("%d",&sum);
    29     while(sum--)
    30     {
    31         memset(f,0,sizeof(f));
    32         memset(visited,0,sizeof(visited));
    33         memset(que,-1,sizeof(que));
    34         int k;
    35         scanf("%d%d%d",&m,&n,&k);
    36         int i;
    37         for(i=1;i<=n;i++)
    38         {
    39             int u,v;
    40             scanf("%d%d",&u,&v);
    41             struct vode *p;
    42             p=(struct vode *)malloc(sizeof(struct vode));
    43             p->v=v;
    44             p->next=f[u];
    45             f[u]=p;
    46             p=(struct vode *)malloc(sizeof(struct vode));
    47             p->v=u;
    48             p->next=f[v];
    49             f[v]=p;
    50         }
    51         fbs(k);
    52     }
    53     return 0;
    54 }
    View Code

     以上是一种算法,也可以用类似邻接矩阵的bfs算法遍历邻接表:

    代码3:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 struct vode
     5 {
     6     int v;
     7     struct vode *next;
     8 };
     9 int m,n;
    10 int visited[101]={0};
    11 struct vode *f[101];
    12 int stack[101];
    13 void paixu(struct vode *head)
    14 {
    15     int k=0;
    16     struct vode *p,*q;
    17     while(k=!k)
    18     {
    19         p=head;
    20         q=p->next;
    21         while(q!=NULL)
    22         {
    23             if(p->v>q->v)
    24             {
    25                 int t;
    26                 t=p->v;
    27                 p->v=q->v;
    28                 q->v=t;
    29                 k=0;
    30             }
    31             else
    32             {
    33                 p=p->next;
    34                 q=p->next;
    35             }
    36         }
    37     }
    38 }
    39 void bfs(int k)
    40 {
    41     int r=0,l=0;
    42     int i;
    43     stack[r++]=k;
    44     visited[k]=1;
    45     for(i=1;i<=m-1;i++)
    46     {
    47         k=stack[l++];
    48         struct vode *p;
    49         paixu(f[k]);
    50         p=f[k];
    51         for(;p!=NULL;p=p->next)
    52         if(visited[p->v]==0)
    53         {
    54             visited[p->v]=1;
    55             stack[r++]=p->v;
    56         }
    57     }
    58     for(i=0;i<=m-1;i++)
    59     if(i==0)printf("%d",stack[i]);
    60     else printf(" %d",stack[i]);
    61     printf("
    ");
    62 }
    63 int main()
    64 {
    65     int q;
    66     scanf("%d",&q);
    67     while(q--)
    68     {
    69         int k;
    70         scanf("%d%d%d",&m,&n,&k);
    71         memset(visited,0,sizeof(visited));
    72         int i;
    73         for(i=1;i<=n;i++)
    74         {
    75             int u,v;
    76             scanf("%d%d",&u,&v);
    77             struct vode *p;
    78             p=(struct vode *)malloc(sizeof(struct vode));
    79             p->v=v;
    80             p->next=f[u];
    81             f[u]=p;
    82             p=(struct vode *)malloc(sizeof(struct vode));
    83             p->v=u;
    84             p->next=f[v];
    85             f[v]=p;
    86         }
    87         bfs(k);
    88     }
    89 }
    View Code
  • 相关阅读:
    城市联动
    Js-右键事件
    JS-键盘移动事件
    Js-点名器
    前端学习——HTML
    前端学习——前端基础
    Redis数据库学习
    2020系统综合实践 期末大作业
    #Nginx+Tomcat+Redis session共享
    2020系统综合实践 第7次实践作业
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3241542.html
Copyright © 2011-2022 走看看