题目内容:
有一个邮递员要在n个城市之间来回送信。但有的城市之间有大路相连而有的没有路。
现在要由一个城市到另一个城市送信,中途最少要经过多少个其它的城市呢?
输入描述
第一行是n,k(1<=n<=10000,1<=k<=20000),接下来就是k行。这k行每行有两个数a,b(1<=a,b<= n),表示城市a和b之间有大路k行以后就是两个数p和q。
输出描述:
输出从城市p到城市q之间最少要经过的其它的城市的数目。如果p和q之间不连通则输出0
输入样例
6 6
1 4
1 2
2 3
3 4
5 4
5 6
1 6
输出样例
2
AC代码:
#include <iostream>
#include <queue>
using namespace std;
int a[1005][1005] = { 0 }; //是否有路
bool visited[1005]; //该点是否访问过
int father[1005]; //存访问路径
queue<int> q;
int main() {
int m, n, s, e, i, j, flag = 0;
cin >> n >> m; //n个点, m条边
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
a[x][y] = a[y][x] = 1;
}
cin >> s >> e;
q.push(s); //将起点加入队列
visited[s] = 1; //设置起点为访问过
while (!q.empty()) //从起点开始将1.与其相连的 2.没有访问过的点加入队列
{
i = q.front();
q.pop();
for (j = i+1; j <= n; j++)
{
if (a[i][j] && !visited[j])
{
visited[j] = 1;
father[j] = i; //存路径
q.push(j);
}
}
int temp = q.front();
if (temp == e) //到达终点
{
flag = 1;
break;
}
}
int count = 0;
if (flag == 1)
while (father[e] != s)
count++, e = father[e];//倒着搜索路径
cout << count << endl;
return 0;
}