小团无路可逃
发布于 2021-04-16
上次编辑 2021-04-16
问题描述
小团惹小美生气了,小美要去找小团“讲道理”。小团望风而逃,他们住的地方可以抽象成一棵有n个结点的树,小美位于 x 位置,小团位于 y 位置。小团和小美每个单位时间内都可以选择不动或者向相邻的位置转移,很显然最终小团会无路可逃,只能延缓一下被“讲道理”的时间,请问最多经过多少个单位时间后,小团会被追上。
格式:
输入:
- 输入第一行包含三个整数 n,x,y,分别表示树上的结点数量,小美所在的位置和小团所在的位置。
- 接下来有 n-1 行,每行两个整数 u,v,表示 u 号位置和 v 号位置之间有一条边,即 u 号位置和 v 号位置彼此相邻。
输出:
- 输出仅包含一个整数,表示小美追上小团所需的时间。
示例:
输入:
5 1 2
2 1
3 1
4 2
5 3
输出:2
提示:
解题思路
方法一:BFS
\(x\) 先走,走过的位置 \(y\) 不能再走。
如果 \(x\) 走到某个位置时,该位置 \(y\) 已经走过,则更新最大值。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 import sys
from collections import deque
from typing import List
readline = sys . stdin . readline
def readint () -> int :
return int ( readline () . strip ())
def readstr () -> str :
return readline () . strip ()
def readints () -> List [ int ]:
return list ( map ( int , readline () . strip () . split ()))
n , x , y = readints ()
adj = [[] for _ in range ( n + 1 )]
for _ in range ( n - 1 ):
u , v = readints ()
adj [ u ] . append ( v )
adj [ v ] . append ( u )
qx , qy = deque ([ x ]), deque ([ y ])
vx , vy = [ False ] * ( n + 1 ), [ False ] * ( n + 1 )
vx [ x ] = vy [ y ] = True
ans , step = 0 , 1
while qx :
m = len ( qx )
for _ in range ( m ):
u = qx . popleft ()
for v in adj [ u ]:
if not vx [ v ]:
vx [ v ] = True
qx . append ( v )
if vy [ v ]:
ans = max ( ans , step )
m = len ( qy )
for _ in range ( m ):
u = qy . popleft ()
for v in adj [ u ]:
if not vx [ v ] and not vy [ v ]:
vy [ v ] = True
qy . append ( v )
step += 1
print ( ans )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 #include <bits/stdc++.h>
using namespace std ;
int main () {
ios_base :: sync_with_stdio ( false ), cin . tie ( nullptr );
int n , x , y ;
cin >> n >> x >> y ;
vector < vector < int >> adj ( n + 1 );
for ( int i = 0 ; i < n - 1 ; ++ i ) {
int u , v ;
cin >> u >> v ;
adj [ u ]. emplace_back ( v );
adj [ v ]. emplace_back ( u );
}
vector < int > vx ( n + 1 ), vy ( n + 1 );
queue < int > qx , qy ;
vx [ x ] = vy [ y ] = 1 ;
qx . emplace ( x ), qy . emplace ( y );
int ans = 0 , step = 1 ;
while ( ! qx . empty ()) {
int m = qx . size ();
while ( m -- ) {
int u = qx . front ();
qx . pop ();
for ( int v : adj [ u ]) {
if ( ! vx [ v ]) {
vx [ v ] = 1 ;
if ( vy [ v ]) {
ans = max ( ans , step );
}
qx . emplace ( v );
}
}
}
m = qy . size ();
while ( m -- ) {
int u = qy . front ();
qy . pop ();
for ( int v : adj [ u ]) {
if ( ! vx [ v ] && ! vy [ v ]) {
vy [ v ] = 1 ;
qy . emplace ( v );
}
}
}
++ step ;
}
cout << ans << '\n' ;
return 0 ;
}