1. 程式人生 > >資料結構實驗圖論一:基於鄰接矩陣/鄰接表的廣度優先搜尋遍歷

資料結構實驗圖論一:基於鄰接矩陣/鄰接表的廣度優先搜尋遍歷

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node
{
    int u,v;
    struct node *next;
} Lin;

Lin *head[105];
int rear,front,vis[105],q[105];
void add(int a,int b)
{
    Lin *p;
    p=(Lin *)malloc(sizeof(p));
    p->v=b;
    p->next=head[a];
    head[a]=p;
}

void BFS(int e)
{
    Lin *p;
    p=head[e];
    while(p)
    {
        int t=p->v;
        if(vis[t]==0)
        {
            q[rear++]=t;
            vis[t]=1;

        }
        p=p->next;
    }
    if(front<rear)
    BFS(q[front++]);
}

int main()
{
    int n,t,m,i,k,j,a,b;
    scanf("%d",&n);
    while(n--)
    {
        memset(head,NULL,sizeof(head));
        memset(vis,0,sizeof(vis));
        scanf("%d%d%d",&k,&m,&t);
        while(m--)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
        }
        int tt;
        for(i=0; i<k; i++)
        {
            Lin *p,*q;
            for( p=head[i]; p; p=p->next)
                for(q=p->next; q; q=q->next)
                {
                    if(q->v<p->v)
                    {
                        int t;
                        t=p->v;
                        p->v=q->v;
                        q->v=t;
                    }
                }
        }
        front=rear=0;
        printf("%d",t);
        vis[t]=1;
        BFS(t);
        for(i=0;i<k-1;i++)
            printf(" %d",q[i]);
        printf("\n");
    }
}