图的遍历--广度优先搜索 bfs


它跟层序遍历有些相似,不过它又加上了一个邻接表
它先是储存邻接表,然后建立一个队,(双向队)先录入第一个数据,然后尾指针依次遍历,然后在头指针这里录入这个结点的邻接结点

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

原题链接// oj2141

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

int a[110][110]; //邻接矩阵
int que[110],head,tail; //队
int book[110]; //记录是否遍历
int main()
{
    int n,i;
    scanf("%d",&n);
    while(n--)
    {
        int k,m,t;
        scanf("%d%d%d",&k,&m,&t);
        memset(a,0,sizeof(a));
        memset(book,0,sizeof(book));
        for(i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            a[u][v]=a[v][u]=1;
        }
        head=0;tail=0;
        que[tail++]=t;
        book[t]=1;
        while(tail>head)
        {
            int x;
            x=que[head++];
            for(i=0;i<k;i++)
            {
                if(a[x][i]==1&&book[i]==0) // 入队
                {
                    que[tail++]=i;
                    book[i]=1;
                }
            }
        }
        for(i=0;i<tail;i++)
        {
            if(i==tail-1) printf("%d\n",que[i]);
            else  printf("%d ",que[i]);
        }
    }
    return 0;
}

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

原题链接 // oj 2142
参考博客
没有用邻接表…

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

int a[110][110]; //邻接矩阵
int que[110],head,tail; //队
int book[110]; //记录是否遍历
int main()
{
    int n,i;
    scanf("%d",&n);
    while(n--)
    {
        int k,m,t;
        scanf("%d%d%d",&k,&m,&t);
        memset(a,0,sizeof(a));
        memset(book,0,sizeof(book));
        for(i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            a[u][v]=a[v][u]=1;
        }
        head=0;tail=0;
        que[tail++]=t;
        book[t]=1;
        while(tail>head)
        {
            int x;
            x=que[head++];
            for(i=0;i<k;i++)
            {
                if(a[x][i]==1&&book[i]==0)
                {
                    que[tail++]=i;
                    book[i]=1;
                }
            }
        }
        for(i=0;i<tail;i++)
        {
            if(i==tail-1) printf("%d\n",que[i]);
            else  printf("%d ",que[i]);
        }
    }
    return 0;
}

用链表做了一下, emm … WA…

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

struct node
{
    int data;
    struct node *next;
};
struct node *st[110];

void sort(int n)
{
    int i,t;
    struct node *p,*q;
    for(i=0;i<n;i++)
    {
        for(p=st[i]->next;p;p=p->next)
        {
            for(q=p->next;q;q=q->next)
            {
                if(p->data>q->data)
                {
                    t=p->data;p->data=q->data;q->data=t;
                }
            }
        }
    }
}
int que[110],book[110];
void bfs(int start)
{
    int head=0,tail=0;
    que[tail++]=start;
    book[start]=1;
    printf("%d",start);
    struct node *p;
    while(tail>head)
    {
        int k;
        k=que[head++];
        for(p=st[k]->next;p;p=p->next)
        {
            if(book[p->data]==0)
            {
                book[p->data]=1;
                printf(" %d",p->data);
                que[tail++]=p->data;
            }
        }
    }
}

int main()
{

    int n,i;
    scanf("%d",&n);
    while(n--)
    {
        int k,m,t;
        scanf("%d%d%d",&k,&m,&t);
        for(i=0;i<k;i++)
        {
            st[i]=(struct node *)malloc(sizeof(struct node ));
            st[i]->next=NULL;
        }
        for(i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            struct node *p,*q;
            p=(struct node *)malloc(sizeof(struct node ));
            p->data=u;
            p->next=st[v]->next;
            st[v]->next=p;
            q=(struct node *)malloc(sizeof(struct node ));
            q->data=v;
            q->next=st[u]->next;
            st[u]->next=q;
        }
        sort(n); //题意要求(同一个结点的同层邻接点,节点编号小的优先遍历)
        memset(book,0,sizeof(book));
        bfs(t);
    }
    return 0;
}

数据结构实验之图论三:判断可达性

原题链接 //oj2138

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[1005][1005];
int st[1005],vis[1005];
int in,out,n,m;
int main()
{
    int i,u,v;
    while(~scanf("%d%d",&n,&m))
    {
        memset(a,0,sizeof(a));
        memset(vis,0,sizeof(vis));
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            a[u][v]=1;
        }
        in=out=0;
        st[in++]=n;
        int flag=0;
        while(in>out)
        {
            int x=st[out++];
            vis[x]=1;
            for(i=1;i<n;i++)
            {
                if(a[x][i]==1&&vis[i]==0)
                {
                    vis[i]=1;
                    st[in++]=i;
                    if(i==1)
                    {
                        flag=1;printf("YES\n");
                    }
                }
            }
        }
        if(flag==0) printf("NO\n");
    }
    return 0;
}

数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

原题链接 oj2139

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int vis[1005];
int a[1005][1005];
int st[1005];
void bfs(int n)
{
    int in=0,out=0,i;
    st[in++]=n;
    while(in>out)
    {
        int x=st[out++];
        for(i=1; i<n; i++)
        {
            if(a[x][i]==1&&vis[i]==-1)
            {
                vis[i]=vis[x]+1;
                st[in++]=i;
            }
        }
    }
}

int main()
{
    int n,m,i,u,v;
    while(~scanf("%d%d",&n,&m))
    {
        memset(a,0,sizeof(a));
        for(i=0; i<n; i++)
        {
            vis[i]=-1;
        }
        vis[n]=0;
        while(m--)
        {
            scanf("%d%d",&u,&v);
            a[u][v]=1;
        }
        bfs(n);
        if(vis[1]==-1)printf("NO\n");
        else printf("%d\n",vis[1]);
    }
    return 0;
}

找朋友

https://acm.sdut.edu.cn/onlinejudge3/problems/2779

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char map[50][50];
int vis[50][50];
struct node
{
    int x,y;
    int step;
}q[300];
int mov[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int x2,y2,n,m;
void bfs(int ii,int  jj)
{
    struct node t;
    int in=0,out=0,i,x,y;
    q[in].x=ii;
    q[in].y=jj;
    q[in++].step=0;
    vis[ii][jj]=1;
    while(in>out)
    {
        t=q[out++];
        if(t.x==x2&&t.y==y2)
        {
            printf("%d\n",t.step);
            return ;
        }
        for(i=0; i<4; i++)
        {
            x=t.x+mov[i][0];
            y=t.y+mov[i][1];
            if(x>=0&&x<n&&y>=0&&y<m&&vis[x][y]==0)
            {
                if(map[x][y]!='#')
                {
                    vis[x][y]=1;
                    q[in].x=x;
                    q[in].y=y;
                    q[in++].step=t.step+1;
                }
            }
        }
    }
    printf("-1\n");
}

int main()
{
    int x1,y1,i,j;
    while(~scanf("%d%d",&n,&m))
    {
        memset(vis,0,sizeof(vis));
        for(i=0; i<n; i++)
        {
            getchar();
            for(j=0; j<m; j++)
            {
                scanf("%c",&map[i][j]);
                if(map[i][j]=='X')
                {
                    x1=i;
                    y1=j;
                }
                else if(map[i][j]=='Y')
                {
                    x2=i;
                    y2=j;
                }
            }
        }
        bfs(x1,y1);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值