这个题目意思很简单,就是按照题目给出来的要求,建造一个没有环的连通图,然后俩个人一个在c,一个在d,他们同时按照最短的路往对方的村子走,然后看他们会在村子相遇还是在道路上相遇。
1:题目很容易转换,我们只需要知道俩个村子之间的最近的距离是奇数还是偶数就行,奇数就是在道路相遇,偶数的话就是在城市相遇。
2:所以我们现在就是要知道每俩个城市之间的距离就行了,但是这里的n有很大,二维数组是不可能开的,所以我们只能取俩个城市到一个固定点的距离,然后再取差值,那这里的这个固定的点就一定得是这个图的,一个端点就是只有一条边的点,因为只有这样的话,差值才是等于俩个城市之间的距离。 就是相当于,只有知道所有点到起点或终点的距离,我们才能用差求出俩个点之间的距离,而如果是知道所有点到某一个不是起点或者终点的距离的话,我们是不能用差直接求出俩个点之间的距离的。
3:好了,既然我们知道,是只有一个边的点,所以我们要做的第一步就是把这个点找出来,这是很容一的事情,我们只需要看每一个点出现的次数就可以了,只出现了一次的就可以作为这个点。
4:当我们找到了这个点之后该怎么求出每一个点到这个点的距离呢,这样的话就要用到我们的dfs了,我们可以先建立一个关于图的邻接矩阵,然后在用dfs来找到每一个点到这个点的距离。因为这些都有很强的模板性,所以我也不多说了,不懂得就去看看dfs什么的,这是很容易做出来的。
然后就是代码
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e6+15;
int ne[N],e[N],h[N];
int idx;
bool v[N];
int tt[N];
int dd[N];
int n;
void add(int a , int b)
{
e[idx] = b , ne[idx] = h[a] , h[a] = idx++;
}
void dfs(int u , int ans)
{
if(u <= 0 || u > n ) return ;
v[u] = true;
for(int i = h[u] ; i != -1 ; i = ne[i])
{
int j = e[i];
if(!v[j])
{
dd[j] = ans;
v[j] = true;
dfs(j , ans + 1);
}
}
}
int main()
{
memset( h , -1 , sizeof h);
int q;
cin >> n >> q;
int T = n- 1;
int p;
while(T--)
{
int a , b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
tt[a] ++,tt[b] ++;
if(tt[a] <= 1)
p = a;
if(tt[b] <= 1)
p = b;
}
dfs(p , 1);
while(q--)
{
int a , b;
scanf("%d%d",&a,&b);
int d = abs(dd[a] - dd[b]);
if(d % 2 )printf("Road\n");
else printf("Town\n");
}
return 0;
}