【题目】据美国动物分类学家内斯特·迈尔推算,世界上有超过100万种动物,各种动物都有自己的语言,假设动物A可以与动物B进行通信,但它不能与动物C通信,动物C只能与动物B通信,所以动物A、B之间的通信需要动物B来当翻译,问两个动物之间相互通信至少需要多少个翻译。
C++版代码
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MAXV 4
//问题表示
int A[MAXV][MAXV]; //图的邻接矩阵
int n,m,k;
int sno,eno;
int visited[MAXV];
struct NodeType
{
int vno; //顶点编号
int length; //路径长度
};
int bfs(int sno,int eno) //广度优先搜索算法
{
if (sno==eno) return 0;
NodeType e,e1;
queue<NodeType> qu; //定义队列
e.vno=sno;
e.length=0;
qu.push(e); //结点e进队
visited[e.vno]=1;
while (!qu.empty()) //队列不空循环
{
e=qu.front(); qu.pop(); //出队结点e
if(e.vno==eno)
return e.length-1;
for(int j=0;j<n;j++)
{
if(A[e.vno][j]!=0) //到顶点j有边
{
if(visited[j]==0)
{
e1.vno=j;
e1.length=e.length+1;
qu.push(e1);
visited[j]=1;
}
}
}
}
return -1;
}
int main()
{
while (scanf_s("%d%d",&n,&m)==2)
{
int a,b,i;
memset(A,0,sizeof(A));
memset(visited,0,sizeof(visited));
for(i=0;i<m;i++) //根据输入建立邻接矩阵
{
scanf_s("%d%d",&a,&b);
A[a][b]=1; //无向图
A[b][a]=1;
}
scanf_s("%d",&k);
for(i=0;i<k;i++)
{
scanf_s("%d %d",&sno,&eno);
printf("%d\n",bfs(sno,eno));
}
}
return 0;
}