#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
typedef struct ArcNode
{
int adjvex;
struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode
{
char data[10];
ArcNode * firstarc;
}VNode,Adjlist[100];
typedef struct
{
Adjlist vertices;
int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,char v[10])
{
for(int i=0;i<G.vexnum;i++)
if(strcmp(v,G.vertices[i].data)==0)
return i;
return -1;
}
void creat(ALGraph &G)
{
cin>>G.vexnum>>G.arcnum;
int i,k,j;
char v1[10],v2[10];
ArcNode * p1,*p2;
for(i=0;i<G.vexnum;i++)
{
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
for(k=0;k<G.arcnum;k++)
{
cin>>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p1=new ArcNode;
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p1;
p2=new ArcNode;
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p2;
}
}
typedef struct
{
char k[100];
int front;
int rear;
}SqQueue;
void InItQueue(SqQueue &q)
{
q.front=q.rear=0;
}
void EnQueue(SqQueue &q,int e)
{
q.rear=(q.rear+1)%100;
q.k[q.rear]=e;
}
void DeQueue(SqQueue &q,int &e)
{
q.front=(q.front+1)%100;
e=q.k[q.front];
}
int QueueEmpty(SqQueue q)
{
if(q.front==q.rear)
return 1;
else
return 0;
}
int visited[100];
void bfs(ALGraph G,int n)
{
SqQueue q;
int u;
printf("v");
printf("%s ",G.vertices[n].data);
visited[n]=1;
InItQueue(q);
EnQueue(q,LocateVex(G,G.vertices[n].data));
ArcNode*p;
while(!QueueEmpty(q))
{
DeQueue(q,u);
p=G.vertices[u].firstarc;
while(p!=NULL)
{
if(!visited[p->adjvex])
{
visited[p->adjvex]=1;
EnQueue(q,p->adjvex);
printf("v");
printf("%s ",G.vertices[p->adjvex].data);
}
p=p->nextarc;
}
}
}
int main()
{
ALGraph G;
creat(G);
int k;
for(k=0;k<100;k++)
visited[k]=0;
bfs(G,0);
return 0;
}
邻接表的广度优先搜索——数据结构
最新推荐文章于 2023-12-01 22:02:19 发布