首页 > 其他分享 >abc271_e Subsequence Path 题解

abc271_e Subsequence Path 题解

时间:2023-05-22 23:45:07浏览次数:53  
标签:10 int 题解 long Subsequence leqslant 序列 Path dp

Subsequence Path

题意

有 \(n\) 个城市和 \(m\) 条有向道路,编号从 \(1\) 开始,第 \(i\) 条道路从 \(a_i\) 到 \(b_i\),长度为 \(c_i\)。

给定一个长度为 \(k\) 的序列 \(e\),我们定义从 \(1\) 到 \(n\) 的一条路径是优秀的当且仅当:

  • 经过的边的编号按顺序构成 \(e\) 的一个子序列。

求从 \(1\) 到 \(n\) 的优秀路径长度最小值,如果不存在,输出 -1

数据范围

  • \(2 \leqslant n \leqslant 2 \times 10^5\),\(1 \leqslant m, k \leqslant 2 \times 10^5\)。
  • \(1 \leqslant a_i, b_i \leqslant n,\ a_i \ne b_i\ (1 \leqslant i \leqslant m)\)。
  • \(1 \leqslant c_i \leqslant 10^9\ (1 \leqslant i \leqslant m)\)。
  • \(1 \leqslant e_i \leqslant m\ (1 \leqslant i \leqslant k)\)。

思路

看起来是一道图论题,但实际上是动态规划!

因为题目要求是 \(e\) 序列的一个子序列,那就可以变成一个类子序列 dp

  • 状态:\(dp_i\) 表示走到城市 \(i\) 的最短距离。
  • 转移:对于 \(1 \leqslant i \leqslant k\),\(dp_{b_{e_i}} = \min({dp_{a_{e_i}} + c_{e_i}, dp_{b_{e_i}}})\)。
  • 初始状态:\(dp_1=0\)。
  • 目标状态:\(dp_n\)。

不开 long long 见祖宗!

复杂度

  • 时间:\(O(n+m+k)\)
  • 空间:\(O(n+m)\)

Code

点击查看代码
#include <iostream>

using namespace std;
using ll = long long; // 前排提示:不开 long long 见祖宗!

const int N = 2e5 + 10;

int n, m, k, e, a[N], b[N], c[N];
ll dp[N];

int main () {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m >> k;
  for (int i = 2; i <= n; i++) {
    dp[i] = 1e18; // 赋值最大值
  }
  for (int i = 1; i <= m; i++) {
    cin >> a[i] >> b[i] >> c[i]; // 记录每条边
  }
  for (int i = 1; i <= k; i++) {
    cin >> e;
    dp[b[e]] = min(dp[b[e]], dp[a[e]] + c[e]); // 转移
  }
  cout << (dp[n] < 1e18 ? dp[n] : -1);
  return 0;
}

标签:10,int,题解,long,Subsequence,leqslant,序列,Path,dp
From: https://www.cnblogs.com/lw0-blog/p/17420295.html

相关文章

  • Apollo planning 模块(三):path decider
    lanefollow场景为例,包含一个stage,每个stage又包含若干个task。在路径决策方面,依次进行lane_change_decider、path_reuse_decider、path_lane_borrow_decider、path_bounds_decider。在路径优化方面,依次进行piecewise_jerk_path_optimizer、path_assessment_decider、path_decider......
  • NOIP2016普及组试题题解
    1.买铅笔代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intn,ans=1e9,a,b;intmain(){ cin>>n; for(inti=1;i<=3;i++){ cin>>a>>b; ans=min(ans,int(ceil(n*1.0/a)*b)); } cout<<ans; return0;}......
  • CF1770F 题解
    \(\text{link}\)。很困难的二进制计数。前置知识\(1\):范德蒙德卷积推广。即\(\sum\limits_{a_1+a_2+\dots+a_n=k,a_i\in\N}\prod\limits_{j=1}^n\dbinom{b_i}{a_i}=\dbinom{b_1+b_2+\dots+b_n}{k}\)。这里给一个组合意义的证明。\(RHS\)相当于在\(\sumb_i\)个物品中选......
  • Atcoder Beginner Contest ABC302 题解
    代码见此:https://atcoder.jp/contests/abc302/submissions?f.Task=&f.LanguageName=&f.Status=&f.User=frequenter。AAttackhttps://atcoder.jp/contests/abc302/tasks/abc302_a直接计算a/b,有余数的话答案加一。BFindSnukehttps://atcoder.jp/contests/abc302/tasks/abc......
  • NOIP2017普及组试题题解
    1.成绩原题:https://www.luogu.com.cn/problem/P3954代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;inta,b,c;intmain(){ cin>>a>>b>>c; cout<<a/10*2+b/10*3+c/10*5; return0;}解题思路:因为数据保证a,b,c都是10的......
  • clip-path 剪切不规则路径后,阴影不生效问题
    正常来说:我们使用box-shadow都是能够生效的,但由于使用了clip剪切功能,使用阴影被剪切了所以我们在使用clip的时候只需要超出path就行了,比如:height:50px;width:100px;background:antiquewhite;clip-path:polygon(50%10%,0%100%,100%100%);box-......
  • [atARC153F]Tri-Colored Paths
    称一条边在环外当且仅当其两端点不全在环上用总方案数减去不合法的方案数,并分类讨论——Case1:图中不存在某种颜色的边否则,若存在简单环的颜色集合为\(\{1,2,3\}\),则环上每种颜色的边恰有一条否则,若颜色为\(1\)的边数\(\ge2\),则去掉其中一条后得到的简单路径矛盾记环上......
  • III.追想 题解
    原题链接我第一次出的一道比较正经的菜题,欢迎大家来切哦。感谢魔法少女老干妈GM_Joanna_的支持对于操作1,3:注意到1e9的数据至多5此操作就能把一个位置变为0,这个次数可视为常数。考虑每个位置暴力改,也只会递归\(5\timesn\logn\)次。对于3操作,考虑最坏的情况,每......
  • Python 02 Xpath
    XpathXpath(XMLPathLanguage)是在XML文档中选择节点的语言一、XPath路径表达式1、XPath节点在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML文档是被作为节点树来对待的,树的根被称为文档节点或者根节点。2、XPath节点关系父(Pa......
  • 【题解】Atcoder ABC302 F,G,Ex
    完全不会G和Ex,这些套路还是要积累一下的。F.MergeSet题目描述:给定\(n\)个集合,每次可以合并两个有交的集合,问最少多少次合并可以让\(1\)和\(m\)位于同一个集合中。题目分析:一开始将题读成了将\([1,m]\)位于同一个集合中,然后就感觉这个题相当不可做。因为集合的元......