代码源每日一题 2022 - 5 - 5

这个题目意思很简单,就是按照题目给出来的要求,建造一个没有环的连通图,然后俩个人一个在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;
}
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值