基于邻接表的长度为k的简单路径的求解
描述
一个连通图采用邻接表作为存储结构。设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径。
输入
多组数据,每组m+3数据行。第一行有两个数字n,m和k,代表有n个顶点,m条边和长度k。第二行有n个字符,代表n个顶点的编号。第三行到第m+2行每行有两个字符h和p,代表边依附的两个顶点。每条边的长度为1。第m+3行有两个字符d和f,代表需要判断的两个字符。
输出
每组数据输出一行。若存在路径输出“YES”,反之输出“NO”。
样例输入1
3 2 2 abc ab bc ac 4 2 5 bcsw bs sw bw 0 0 0
样例输出1
YES NO
解答:广度优先搜索创建的邻接表,查看第k层是否包含查找的目标结点。
#include<stdio.h>
#include<stdlib.h>
#define maxn 300
typedef struct node
{
int data;
struct node *next;
} Node;
int flag,k;
int hash[maxn];
int visit[maxn];
Node *V[maxn];
void BFS(int s,int e)
{
Node *p;
int count=1;
int Queue[maxn];
int front=0,last=0,rear=0;
Queue[0]=s;
visit[V[s]->data]=1;
while(front<=last)
{
p=V[Queue[front++]]->next;
while(p)
{
if(!visit[p->data])
{
if(count==k && p->data == e)
{
flag=1;
break;
}
Queue[++rear]=p->data;
visit[p->data]=1;
}
p=p->next;
}
if(flag)
break;
if(front>last)
{
last=rear;
count++;
}
}
}
int main()
{
int n,m;
char x,y;
Node *p;
while(1)
{
scanf("%d %d %d",&n,&m,&k);
if(n==0 && m==0 && k==0)
break;
for(int i=0; i<maxn; i++)
hash[i]=0;
getchar();
for(int i=1; i<=n; i++)
{
scanf("%c",&x);
hash[x]=i;
V[i]=(Node *)malloc(sizeof(Node));
V[i]->data=i;
V[i]->next=NULL;
}
while(m--)
{
getchar();
scanf("%c %c",&x,&y);
p=(Node *)malloc(sizeof(Node));
p->data=hash[y];
p->next=V[hash[x]]->next;
V[hash[x]]->next=p;
p=(Node *)malloc(sizeof(Node));
p->data=hash[x];
p->next=V[hash[y]]->next;
V[hash[y]]->next=p;
}
for(int i=1; i<=n; i++)
visit[i]=0;
getchar();
scanf("%c %c",&x,&y);
flag=0;
BFS(hash[x],hash[y]);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}