基于邻接表的广度优先搜索

 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\n",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 }

 

posted on 2013-11-20 09:16  随风浪子的博客  阅读(215)  评论(0编辑  收藏  举报

导航