//基于图的广度优先搜索(邻接表)
#include <stdio.h>
#include <stdlib.h>
#define max 200
typedef struct arcnode{ //arc弧, 边表
int adjvex; //该弧指向的节点(adj 邻域)
// int weight; //权重
struct arcnode *next; //同一节点下一条边
}arcnode;
typedef struct vnode{ //节点表
int data; //节点信息????
arcnode *firstarc; //第一条边
}vnode,adjlist;
typedef struct{
adjlist vertices[max]; //邻接表
int vexnum,arcnum; //顶点数,边数
}algraph;
typedef struct Queue{
arcnode N[max];
int first,rear;
}Queue;
Queue q; //全局变量
int IsEmpty(Queue *Q){
if(Q->first == Q->rear)
return 1;
else
return 0;
}
void Push(Queue *Q,arcnode *n){
if((Q->rear+1)%max == Q->first)
{
printf("满");
}
else
{
Q->N[Q->rear] = *n;
Q->rear++;
}
}
arcnode* Pop(Queue *Q){
if(Q->rear == Q->first)
{
printf("空");
}
else
{
Q->first++;
return &Q->N[Q->first-1];
}
}
void InitAlgraph(algraph *G){
for(int i = 0;i < max;i++)
{
G->vertices[i].data = 0;
G->vertices[i].firstarc = NULL;
}
scanf("%d %d",&G->arcnum,&G->vexnum);
for(int i = 1;i <= G->arcnum;i++)
{
scanf("%d",&G->vertices[i].data);
}
arcnode *p;
for(int i = 1;i <= G->vexnum; i++)
{
int vi,vj;
scanf("%d %d",&vi,&vj);
p = (arcnode*)malloc(sizeof(arcnode));
p->adjvex = vj;
p->next = G->vertices[vi].firstarc;
G->vertices[vi].firstarc = p;
}
}
int bfs(int vi,int vj,algraph *G){
arcnode *p,*m;
p = G->vertices[vi].firstarc;
Push(&q,p);
while(!IsEmpty(&q))
{
m = Pop(&q);
while(m!=NULL)
{
if(m->adjvex == vj)
{
return 1;
}
else
{
if(G->vertices[m->adjvex].firstarc != NULL)
Push(&q , G->vertices[m->adjvex].firstarc);
m = m->next;
}
}
}
return -1;
}
int main(){
algraph g;
InitAlgraph(&g);
int vi,vj;
scanf("%d %d",&vi,&vj);
q.first = 1;
q.rear = 1;
int flag = bfs(vi,vj,&g);
if(flag==1)
printf("yes");
else
printf("no");
return 0;
}
noj20 基于图的广度优先搜索策略
最新推荐文章于 2022-05-12 20:42:55 发布