生活实际问题描述:
问题来源:http://acm.buaa.edu.cn/problem/921/
蒹葭苍苍,白露为霜,所谓伊人,在水一方。人海茫茫,能够遇上一个人,是一种缘分。
不过,xxx相信所谓的六度空间理论(也称六度分隔理论),故而他相信,有些缘分是可以主动追求的。
现在有n个人,编号从1到n,其中一些人之间有联系,现在Jeffrey想知道,一个编号为u的人,最少通过几个人可以联系到编号为v的人?
算法思想:
类似于层次遍历二叉树,利用BFS遍历图以求得最短路径。每当当前节点的所有邻接点均被访问之后,访问的层次增加加一。
#define MaxSize 310
typedef struct node
{
int data;
node* nextEdge;
}EdgeNode;
typedef struct
{
EdgeNode* firstEdge;
}HeadNode;
typedef struct
{
int n;
int e;
HeadNode adjList[MaxSize];
}Graph;
int BFS(Graph* g,int u,int v)
{
int qu[MaxSize];
int level[MaxSize];
int i;
int front=0,rear=0,k,lev;
memset(level,0,sizeof(level));
memset(visited,0,sizeof(visited));
EdgeNode* p;
visited[u]=1;
rear++;
qu[rear]=u;
level[rear]=0;
while(front!=rear)
{
front=(front+1)%MaxSize;
k=qu[front];
lev=level[front];
if(k==v)//找到目标节点
return lev-1;//对应所描述的实际问题,返回值为lev-1;如果求最短路径长度,则直接返回lev
p=g->adjList[k].firstEdge;
while(p!=NULL)
{
if(visited[p->data]==0)
{//节点尚未访问
visited[p->data]=1;
rear=(rear+1)%MaxSize;
qu[rear]=p->data;
level[rear]=lev+1;
}
p=p->nextEdge;
}
}
return -1;
}