给定一个有N个顶点和E条边的无向图,顶点从0到N−1编号。请判断给定的两个顶点之间是否有路径存在。如果存在,给出最短路径长度。 这里定义顶点到自身的最短路径长度为0。 进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。 随后E行,每行给出一条边的两个顶点。每行中的数字之间用1空格分隔。 最后一行给出两个顶点编号i,j(0≤i,j<N),i和j之间用空格分隔。
输出格式:
如果i和j之间存在路径,则输出"The length of the shortest path between i and j is X.",X为最短路径长度, 否则输出"There is no path between i and j."。
输入样例1:
7 6
0 1
2 3
1 4
0 2
1 3
5 6
0 3
输出样例1:
The length of the shortest path between 0 and 3 is 2.
输入样例2:
7 6
0 1
2 3
1 4
0 2
1 3
5 6
0 6
输出样例2:
There is no path between 0 and 6.
#include<bits/stdc++.h>
#define inf 999999999
using namespace std;
int G[15][15];//floyd算法
int main()
{
int n,e,i,j,k;
cin>>n>>e;//输入顶点和边数
for(i=0;i<=n;i++)//对G初始化,这里i<=n这里必须要有等号,感觉是题目的bug
{
for(j=0;j<=n;j++)
{
if(i==j)
G[i][j]=0;
else
G[i][j]=inf;
}
}
int x,y;
for(i=0;i<e;i++)
{
cin>>x>>y;//输入路径
G[x][y]=1;
G[y][x]=1;
}
cin>>x>>y;//输入需要求的两个地点
for(k=0;k<n;k++)//Floyd算法核心
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(G[i][k]<inf&&G[k][j]<inf&&G[i][j]>G[i][k]+G[k][j])
{
G[i][j]=G[i][k]+G[k][j];
}
}
}
}
if(G[x][y]<inf)
{
printf("The length of the shortest path between %d and %d is %d.\n",x,y,G[x][y]);
}
else
{
printf("There is no path between %d and %d.\n",x,y);
}
return 0;
}