41-邮差送信(dfs)

时间:2023-03-09 01:08:12
41-邮差送信(dfs)

              邮差送信 (15分)
C时间限制:1 毫秒 |  C内存限制:3000 Kb
题目内容:

有一个邮递员要在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

#include <iostream>
using namespace std;
int a[100][100]; //存路径
int far[100]; //求路径,即存储它的前一个结点
int n, m, p, q; //n个城市, m条路, p起点, q终点
int z[1000]; //模拟队列
int visit[100]; //标记是否访问过 void print(int w){
int count = 0;
// cout << "w" << w << endl;
while(far[w] != p){
count++;
w = far[w];
}
cout << count;
} void dfs(){
int head = 1, tail = 2;
z[head] = p;
visit[p] = 1;
int flag = 1;
while(head < tail && flag){
for(int i = 1; i <= n; i++){
if(a[z[head]][i] == 1 && visit[i] == 0){
visit[i] = 1;
z[tail] = i;
tail++;
far[i] = z[head];
if(i == q){ //找到退出
// cout << "find" << endl;
flag = 0;
print(i);
break;
}
}
}
head++;
}
if(head == tail) //未找到
cout << 0;
} int main(){
cin >> n >> m;
int x, y;
for(int i = 1; i <= m; i++){
cin >> x >> y;
a[x][y] = a[y][x] = 1;
}
cin >> p >> q;
dfs();
return 0;
}