把该图类比成树,转化成求两个节点在树的第几层,根节点随意取,这里取1为根节点,将两个节点的层数相加看奇偶,是偶数则能在村镇相遇,否则只能在路上相遇
用邻接表存图,因为无向图,需开到2e5的大小,稀疏图跑堆优化的djikstra
其实bfs也可以做此题
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=2e5+5;
typedef pair<int,int> PII;
int n,q,idex,nex[N],e[N],h[N],dis[N],vis[N];
void add(int a,int b)
{
e[idex]=b,nex[idex]=h[a],h[a]=idex++;
}
void dijkstra()
{
memset(dis,0x3f,sizeof(dis));
dis[1]=0;
priority_queue<PII,vector<PII>,greater<PII>> heap;
heap.push({0,1});
while(heap.size()!=0)
{
int t=heap.top().second;
heap.pop();
if(vis[t]==1) continue;
vis[t]=1;
for(int i=h[t];i!=-1;i=nex[i])
{
int j=e[i];
if(dis[j]>dis[t]+1)
{
dis[j]=dis[t]+1;
heap.push({dis[j],j});
}
}
}
}
int main()
{
scanf("%d%d",&n,&q);
int a,b;
memset(h,-1,sizeof(h));
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dijkstra();
for(int i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
if((dis[a]+dis[b])%2==0)
{
puts("Town");
}else
{
puts("Road");
}
}
}