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

来源:互联网 发布:佐拉算法说的那些人 编辑:程序博客网 时间:2024/06/03 21:36

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

#include <iostream>  #include <cstdio>  #include <cstring>  using namespace std;  const int MAXN=100+10;  int n,m,s;  bool vis[MAXN];  int head[MAXN];  int cnt;  struct node  {      int v;      int next;  }edge[5000];  void add(int u,int v)  {      edge[cnt].v=v;      edge[cnt].next=head[u];      head[u]=cnt++;  }  bool check(int u,int v)  {      for(int i=head[u];i!=-1;i=edge[i].next)      {          if(edge[i].v==v)return 1;      }      return 0;  }  void bfs(int s)  {      memset(vis,0,sizeof(vis));      int q[110];      int qhead=0,qtail=0;      vis[s]=1;      q[qtail++]=s;      while(qhead<qtail)      {          int k=q[qhead++];          printf("%d ",k);          for(int i=0;i<n;++i)          {              if(!vis[i]&&check(k,i))              {                  vis[i]=1;                  q[qtail++]=i;              }          }      }  }  int main()  {      int t;      scanf("%d",&t);      while(t--)      {          scanf("%d%d%d",&n,&m,&s);          memset(head,-1,sizeof(head));          int u,v;          cnt=0;          for(int i=0;i<m;++i)          {              scanf("%d%d",&u,&v);              add(u,v);              add(v,u);          }          bfs(s);          puts("");      }      return 0;  }  
错误的代码/*#include<stdio.h> #include<string.h>  int k, m, t;  int visit[200], b[200];  //visit是标记数组;b数组用来存放搜索的点,每次搜索一遍经排序后就输出struct node  {      int u, v;      node *next;  }*head[200];  //;邻接表void add(int u, int v)  {      node *p=new node;      p->u=u;      p->v=v;      p->next=head[u];      head[u]=p;  }  void bfs(int t)  {      node *p=new node;      visit[t]=1;      p=head[t];      int s=1;      while(p)      {          if(visit[p->v]==0)          {              b[s++]=p->v;              visit[p->v]=1;              p=p->next;          }          else          {              p=p->next;          }      for(int i=1;i<s;i++)  //用冒泡把每次搜索到的与同一个节点同层的邻接点从小到大排序    {          for(int j=1;j<s-i;j++)          {              if(b[j]>b[j+1])              {                  int t;                  t=b[j];                  b[j]=b[j+1];                  b[j+1]=t;              }          }      }      for(int i=1;i<s;i++)  //把每次搜索到的节点输出        printf(" %d", b[i]);      for(int i=1;i<s;i++)  //广度优先搜索        bfs(b[i]);  }  int main()  {      int n, u, v;      scanf("%d", &n);      while(n--)      {          memset(visit,0,sizeof(visit));          memset(head,NULL,sizeof(head));          scanf("%d%d%d", &k, &m, &t);          while(m--)          {              scanf("%d%d", &u, &v);              add(u, v);  //add函数建立邻接表            add(v, u);          }          printf("%d", t);  //先把最先需要搜索的点输出,即遍历的起始点        bfs(t);          printf("\n");      }      return 0;  }  */
0 0