首页 > 其他分享 >1014 CW 模拟赛 B.旅行

1014 CW 模拟赛 B.旅行

时间:2024-10-14 14:59:12浏览次数:5  
标签:旅行 vis int dfs fa maxn 1014 rm CW

题面

现在的题似乎都找不到原题了
挂个 pdf
题面下载

算法

容易想到链和菊花图的做法, 需要注意的是计算深度只能用 \(\rm{dfs}\) 来跑, 不能保证链的顺序与输入顺序相同

对于 \(n, m \leq 10^3\), 观察暴力做法

暴力

容易发现对于每一个点, 都要由起点 \(1\) 开始, 先到达一条链上最深的点, 再折返跑过来
对于每一个 \(a_i, i \in [1, m]\) , 将 \(a_1 \sim a_i\) 打上标记, \(\rm{dfs}\) 搜索每一个点, 判断这个点下方是否还有有标记的点, 若没有统计这个点的深度, 减去起点深度之后乘以二, 最后减去终点到起点即可

暴力代码

int dfs2(int u=1,int fa=0){
	int ret=0;
	for(int v:e[u]){
		if(v==fa)continue;
		ret+=dfs2(v,u);
	}
	if(ret==0)return 2*usd[u];
	else return ret+2;
}

暴力总结

\(\rm{dfs}\) 的递归特性使其能判断自己下方的情况
若从起点开始找终点困难, 考虑从每个终点拆分的去计算路径长度
树上的距离问题, 通常可以拆分成树上深度问题

正解

观察到暴力方式每一次加入新点都需要重新跑一边 \(\rm{dfs}\), 这显然是无必要的
如果能每次加入一个点, 计算这个点带来的路径变化即可
想到 LCA, 然而需要和前面每一个点求 LCA , 对时间复杂度优化不大 ( \(n, m\) 为同一数级 )
观察图的性质, 发现在 LCA 之后的路径都已经被前面的 \(\rm{dfs}\) 计算过了, 于是在每次 \(\rm{dfs}\) 计算时, 把经过的每一条边都标记起来, 如果遇到已经标记的边, 则无需计算

正解代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int maxn = 100010;
int n, m, a[maxn], fa[maxn], dep[maxn], ans, vis[maxn];
vector<int> vec[maxn];

void dfs(int u, int f)
{
    fa[u] = f;
    dep[u] = dep[f] + 1;
    for (auto v : vec[u])
        if (v != f)
        {
            dfs(v, u);
        }
}

void add(int u)
{
    if (vis[u])
        return;
    int res = 1;
    vis[u] = 1;
    while (!vis[fa[u]])
        u = fa[u], vis[u] = 1, res++;
    ans += 2 * res;
}

signed main()
{
    //	freopen ("B.in", "r", stdin);
    //	freopen ("B.out", "w", stdout);

    scanf("%lld%lld", &n, &m);
    for (int i = 1, u, v; i < n; i++)
    {
        scanf("%lld%lld", &u, &v);
        vec[u].push_back(v);
        vec[v].push_back(u);
    }
    for (int i = 1; i <= m; i++)
    {
        scanf("%lld", &a[i]);
    }
    dep[0] = -1;
    dfs(1, 0);
    vis[1] = 1;
    for (int i = 1; i <= m; i++)
    {
        add(a[i]);
        printf("%lld\n", ans - dep[a[i]]);
    }
    return 0;
}

正解总结

想到复杂的方法, 优化不了复杂度
考虑找规律找更简单的方法

标签:旅行,vis,int,dfs,fa,maxn,1014,rm,CW
From: https://www.cnblogs.com/YzaCsp/p/18464139

相关文章

  • 2023 年和 2024 年最具威胁的 25 种安全漏洞(CWE Top 25)
    目录1.缓冲区溢出(CWE-120)2.代码注入(CWE-94)3.认证缺失(CWE-287)4.访问控制缺失(CWE-284)5.SQL注入(CWE-89)6.跨站脚本(XSS)(CWE-79)7.不安全的反序列化(CWE-502)8.脆弱的随机数生成(CWE-331)9.信息泄露(CWE-200)10.不安全的直接对象引用(CWE-63......
  • 力扣1436. 旅行终点站 python
    给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i]=[cityAi,cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。题目数据保证线路图会形成一条不存在循环的线路,因此恰有......
  • 霍普菲尔德(Hopfield)神经网络求解旅行商问题TSP,提供完整MATLAB代码,复制粘贴即可运行
    Hopfield神经网络是以美国物理学家约翰·霍普菲尔德(JohnHopfield)的名字命名的。他在1982年提出了这种类型的神经网络模型,因此通常被称为Hopfield网络。旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题,即在给定一组城市及城市之间的距离,找到一条遍历所有......
  • 702 旅行商
    //702旅行商.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/5/problem/249蜗蜗的世界里有n个城市,城市两两之间通过高速公路连接,从第i个城市走到第j个城市需要花费ai,j的时间。现在蜗蜗想从1号城市出发......
  • P5416 = UOJ 198 时空旅行 题解
    Statement一棵树,每个节点上有一个集合,每个儿子集合由父亲集合增加一个点\((x_i,c_i)\)或删除一个点得到。根节点集合为\(\{(0,0,0,c_0)\}\)多次询问,每次问\(u\)点的集合内,\(\min\{(x_i-x)^2+c_i\}\)Solution首先你认真读完题发现原题中\(y,z\)都是没用的然后离线DFS......
  • Acwing-246. 区间最大公约数
    本蒟蒻的第二篇题解qwq.题目大意:给定一个长度为\(N\)的数组,需要在数组上进行两种操作:1.Clrd,表示把\(A[l],A[l+1],...,A[r]\)都加上\(d\).2.Qlr,表示询问\(A[l],A[l+1],...,A[r]\)的最大公约数\((GCD)\).错误解法:如果你是一个只会打暴力的小蒟蒻(就像我),看......
  • 跨过坦克300,捷途旅行者成市场新贵
    在坦克300稳坐燃油“方盒子”SUV王座的日子里,消费者们对于这款车型的热衷可谓是如痴如醉,纷纷选择预定,翘首以盼提车之日的到来。然而,市场的风云变幻莫测,捷途旅行者的横空出世,犹如一匹黑马,打破了原有的市场格局。捷途旅行者上市后,其强劲的市场表现让坦克300的市场份额受到了......
  • 基于springboot+vue的Android的乡村研学旅行APP系统app小程序(源码+文档+部署讲解等)
    前言......
  • [ARC061E] すぬけ君の地下鉄旅行 题解
    题目传送门一些废话今天登洛谷的时候发现主页少了一道紫题。???怎么降绿了(建议升蓝)???AND这是蒟蒻的第一篇题解简介很容易地想到,这是一道最短路问题,要求在一个有\(N\)个站点和\(M\)条地铁线路的图中,从站点\(1\)到站点\(N\)的最小花费。每条线路由一个公司运营,乘坐同一......
  • Acwing 1027.方格取数
    题目链接算法1(数字三角性模型)这道题是摘花生题目的延申摘花生:走一条路这道题与摘花生题的区别在于走的路数,该题走两条路,而且是两条路同时走的思想。那么按照摘花生的题的思路,能否两条路各自取最大值呢?答案是不行。因为第一次摘花生,第一次的最优解已经影响到第二次的最......