[NOJ]数据结构 NO.20基于图的广度优先搜索策略
#include<stdio.h>
#include<stdlib.h>
//图结构
typedef struct EdgeNode
{
int endvex;
struct EdgeNode *nextedge;
}EdgeNode;
typedef struct
{
int vertex;
EdgeNode* edgelist;
}VexNode;
typedef struct
{
VexNode vexs[100];
int vexnum,edgenum;
}Graph;
//队列结构
typedef struct node
{
int data;
struct node *next;
}node;
typedef struct
{
node *front;
node *rear;
}Queue;
int locate(Graph*g,int v);
void create(Graph*g);
int bfs(Graph*g,int v1,int v2);
void initQ(Queue*q);
void enterQ(Queue*q,int x);
int outQ(Queue*q);
int main()
{
Graph*g=(Graph*)malloc(sizeof(Graph));
create(g);
int v1,v2,i,j;
scanf("%d %d",&v1,&v2);
i=locate(g,v1);
j=locate(g,v2);
if(bfs(g,i,j)) printf("yes");
else printf("no");
return 0;
}
int locate(Graph*g,int v) //定位顶点在数组的位置
{
int i;
for(i=0;i<g->vexnum;i++)
if(g->vexs[i].vertex==v) return i;
}
void create(Graph *g) //图的初始化
{
int i,j,k,v1,v2;
EdgeNode*p;
scanf("%d %d",&g->vexnum,&g->edgenum);
for(i=0;i<g->vexnum;i++)
{
scanf("%d",&g->vexs[i].vertex);
g->vexs[i].edgelist=NULL;
}
for(k=0;k<g->edgenum;k++){
scanf("%d %d",&v1,&v2);
i=locate(g,v1);
j=locate(g,v2);
p=(EdgeNode*)malloc(sizeof(EdgeNode));
p->endvex=j;
p->nextedge=g->vexs[i].edgelist;
g->vexs[i].edgelist=p;
}
}
void initQ(Queue*q) //队列初始化
{
q->front=(node*)malloc(sizeof(node));
q->rear=q->front;
q->front->next=NULL;
}
void enterQ(Queue*q,int x) //进队列
{
node* p;
p=(node*)malloc(sizeof(node));
p->data=x;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
int outQ(Queue*q) //出队列
{
int x;
node *p;
if(q->front==q->rear) return -1;
p=q->front->next;
q->front->next=p->next;
if(q->rear==p) q->rear=q->front;
x=p->data;
free(p);
return x;
}
int visited[100]={0};
int bfs(Graph*g,int v1,int v2) //广度搜索
{
Queue Q;
EdgeNode *p;
int j;
initQ(&Q);
visited[v1]=1;
enterQ(&Q,v1);
while((j=outQ(&Q))!=-1)
{
p=g->vexs[j].edgelist;
while(p!=NULL)
{
if(!visited[p->endvex])
{
if(p->endvex==v2) return 1;
visited[p->endvex]=1;
enterQ(&Q,p->endvex);
}
p=p->nextedge;
}
}
return 0;
}