bfs题目
它跟层序遍历有些相似,不过它又加上了一个邻接表
它先是储存邻接表,然后建立一个队,(双向队)先录入第一个数据,然后尾指针依次遍历,然后在头指针这里录入这个结点的邻接结点
数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
#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;
}
数据结构实验之图论三:判断可达性
#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)
#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;
}