[ABC271E] Subsequence Path 题解

[ABC271E] Subsequence Path Solution

更好的阅读体验戳此进入

题面

给定 $ n $ 个点 $ m $ 条边有边权无自环的无向图,给定边集序列 $ E_k $,求边集序列的子序列路径使得能按序从 $ 1 $ 到 $ n $ 且路径长度最小,输出最小值,无解输出 -1

Solution

最开始的思路是把边集下放然后每个点挂多个 pair < ll, int > 表示到这个点的所有可能的权值与其对应的最小的序列终止位置,然后用类似二维偏序的思路转移,但是不确定这个思路假没假以及复杂度是否正确,不过细想一下就会发现这题实际上特别水。

不难发现我们要找的是边的子序列,也就是其是有顺序的,那么我们直接按照边序列顺序跑的话显然是无后效性的,所以我们可以按照最短路的思想,考虑记录到每个点的 $ dis $,然后按序列顺序遍历边,用其起始点的 $ dis $ 加上边权去更新该点的 $ dis $,注意到这里我们可以这么做的原因是如果要求前面的边,一定不会在其之前先走后面的边,这也就是我们刚才提到的无后效性,这样最后 $ dis_n $ 就是答案了。

Code

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

#define PI M_PI
#define E M_E
#define npt nullptr
#define SON i->to
#define OPNEW void* operator new(size_t)
#define ROPNEW void* Edge::operator new(size_t){static Edge* P = ed; return P++;}
#define ROPNEW_NODE void* Node::operator new(size_t){static Node* P = nd; return P++;}

using namespace std;

mt19937 rnd(random_device{}());
int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
bool rnddd(int x){return rndd(1, 100) <= x;}

typedef unsigned int uint;
typedef unsigned long long unll;
typedef long long ll;
typedef long double ld;

#define INFLL (0x3f3f3f3f3f3f3f3fll)

template < typename T = int >
inline T read(void);

int N, M, K;
struct{int s, t, v;}edg[210000];
ll dis[210000];

int main(){
    memset(dis, 0x3f, sizeof dis);
    N = read(), M = read(), K = read();
    for(int i = 1; i <= M; ++i)edg[i].s = read(), edg[i].t = read(), edg[i].v = read();
    dis[1] = 0;
    for(int i = 1; i <= K; ++i){
        int idx = read();
        dis[edg[idx].t] = min(dis[edg[idx].t], dis[edg[idx].s] + edg[idx].v);
    }printf("%lld\n", dis[N] == INFLL ? -1ll : dis[N]);
    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}

template < typename T >
inline T read(void){
    T ret(0);
    int flag(1);
    char c = getchar();
    while(c != '-' && !isdigit(c))c = getchar();
    if(c == '-')flag = -1, c = getchar();
    while(isdigit(c)){
        ret *= 10;
        ret += int(c - '0');
        c = getchar();
    }
    ret *= flag;
    return ret;
}

UPD

update-2023_02_09 初稿

posted @ 2023-02-15 19:07  Tsawke  阅读(20)  评论(0编辑  收藏  举报