广度搜索

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

typedef struct node
{
 int adjvex;
 struct node *next;
}EdgeNode;

typedef struct vnode
{
 char c;
 EdgeNode *firstedge;
}VertexNode;

VertexNode AdjList[10001];
int pre[10001];           //用于记录各节点的前驱
int d[10001];             //用于记录用原点到各节点的距离

void InPut(int n,int e)   //节点及边的录入 以及建立邻接表

 int i,j,s,d,find;
    char ch1,ch2;
 EdgeNode *p,*q;
 printf("请输入一次输入所有字符节点 且第一个输入的点默认为源节点\n");
 for(i=0;i<n;i++)
 {
  scanf("%c ",&AdjList[i].c);
  AdjList[i].firstedge=NULL;
 }
 printf("请输入各条边\n");
 for(i=1;i<=e;i++)//建立邻接表 由于是无向图则要申请两个节点p和q
 {  
  find=0;
  scanf("%c %c ",&ch1,&ch2);
  for(j=0;find!=2&&j<n;j++)
   if(ch1==AdjList[j].c)
   {
    s=j;
    find++;        
   }
   else if(ch2==AdjList[j].c)
   {
    d=j;
    find++;  
   }

   p=(EdgeNode*)malloc(sizeof(EdgeNode));//由于是无向图则要申请两个节点p和q
   q=(EdgeNode*)malloc(sizeof(EdgeNode));
 
   p->adjvex=d;
  
   p->next=AdjList[s].firstedge;
   AdjList[s].firstedge=p;
  
   q->adjvex=s;
   q->next=AdjList[d].firstedge;
   AdjList[d].firstedge=q; 
 }
}

void BFS(int n)//广度搜索
{
 int color[10001]; //1代表白色表示该点尚未发现 2代表灰色现已发现 3代表黑色表示与它邻接的边已发现
 int i,u,v,max=100000000;
 int queue[10001],head,tail; 
 EdgeNode *p;

 for(i=0;i<n;i++)
 {
  d[i]=max;
  color[i]=1;//1代表白色表示该点尚未发现
  pre[i]=-1;
 }

 color[0]=2;//2代表灰色 原点 现已发现
 d[0]=0;
 pre[0]=-1;

 head=0; tail=-1;//队列置空
    queue[++tail]=0;//源点进队
 while(head<=tail)
 {
  u=queue[head++];//出队
  p=AdjList[u].firstedge;
  while(p)//搜索所有以u的邻接边 即点v  并进队
  {  
   v=p->adjvex;
   if(color[v]==1)
   {
    color[v]=2;
       d[v]=d[u]+1;
       pre[v]=u;
       queue[++tail]=v;
   }
   p=p->next;
  }
        color[u]=3;//所有以u的邻接边已发现 并把u点置为黑色表示完成
 }
}

void printpath(int i,int n)//递归输出源点到各点的路径
{  
 if(pre[i]==-1)
 {
 
    printf("%c->",AdjList[i].c);
    return ;
 }
 else
 {
    printpath(pre[i],n);
    if(i==n)
      printf("%c",AdjList[i].c);
    else
   printf("%c->",AdjList[i].c);
 }
}

void print(int n)输出源点到各点的长度及路径
{
 int i;
 for(i=1;i<n;i++)
 {
  printf("%d: ",d[i]);
  printpath(i,i);//递归输出源点到各点的路径
  printf("\n");
 }
}
   
int main()
{   freopen("1.txt","r",stdin);
 int n,e;
 printf("请输入字符节点的个数N 和边的数目E:\n");
 scanf("%d%d ",&n,&e);
 
 InPut(n,e); //节点及边的录入 以及建立邻接表
 BFS(n);//广度搜索
 print(n);//输出源点到各点的长度及路径
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值