首页 > 其他分享 >[ABC252E] Road Reduction 题解

[ABC252E] Road Reduction 题解

时间:2023-01-07 15:34:11浏览次数:48  
标签:cur int 题解 void tp Reduction ABC252E dis define

[ABC252E] Road Reduction Solution

目录

更好的阅读体验戳此进入

题面

给定 $ n $ 个点 $ m $ 条边的无向连通简单图,每条边为 $ a_i $ 到 $ b_i $,权值为 $ c_i $。你需要构造一棵生成树,最小化点 $ 1 $ 在生成树上到其它所有点的距离和,输出生成树的所有边的序号。如果有多个方案随便输出一个即可。

Solution

模板题,最短路生成树。

以 $ 1 $ 为原点跑一遍单源最短路,也就是 Dijkstra,我们在每次松弛操作的时候记录一下是通过哪条边松弛的。最后这些边将恰好组成一棵生成树,直接输出这些边的序号即可。

大概的证明可以感性理解一下,当我们用点 $ s $ 的边去更新 $ dis(t) $ 的时候,显然此时 $ s $ 一定已经被更新过了,也就是已经和 $ 1 $ 连结了,所以保留当前这条边即可,这样一定会形成一个树形结构。而我们跑的是最短路,这棵生成树也一定是最优的。

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(arr) void* Edge::operator new(size_t){static Edge* P = arr; 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;

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

struct Edge{
    Edge* nxt;
    int to;
    int val;
    int idx;
    OPNEW;
}ed[410000];
ROPNEW(ed);
Edge* head[210000];

int N, M;
ll dis[210000];
bool vis[210000];
int idx[210000];

void Dijk(void){
    memset(dis, 0x3f, sizeof dis);
    priority_queue < pair < ll, int >, vector < pair < ll, int> >, greater < pair < ll, int > > > cur;
    dis[1] = 0, cur.push({dis[1], 1});
    while(!cur.empty()){
        int tp = cur.top().second; cur.pop();
        if(vis[tp])continue;
        vis[tp] = true;
        for(auto i = head[tp]; i; i = i->nxt)
            if(dis[tp] + i->val < dis[SON])
                dis[SON] = dis[tp] + i->val, idx[SON] = i->idx, cur.push({dis[SON], SON});
    }
}

int main(){
    // freopen("random_01.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    N = read(), M = read();
    for(int i = 1; i <= M; ++i){
        int s = read(), t = read(), v = read();
        head[s] = new Edge{head[s], t, v, i};
        head[t] = new Edge{head[t], s, v, i};
    }Dijk();
    for(int i = 2; i <= N; ++i)printf("%d%c", idx[i], i == N ? '\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-2022_12_03 初稿

标签:cur,int,题解,void,tp,Reduction,ABC252E,dis,define
From: https://www.cnblogs.com/tsawke/p/17032735.html

相关文章

  • [ABC252D] Distinct Trio 题解
    [ABC252D]DistinctTrioSolution目录[ABC252D]DistinctTrioSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定序列$a_n$,求满......
  • P8865 [NOIP2022] 种花 题解
    P8865[NOIP2022]种花Solution目录P8865[NOIP2022]种花Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面大概就是在有障碍的网格图......
  • 【题解】P4218 [CTSC2010]珠宝商
    这种题出出来有什么必要吗,不就是难写的暴力弱智题。题意给定一棵树和一个文本串\(T\),每个结点上有一个字符,问树上任意路径构成的字符串在\(T\)中的出现次数之和。\(n......
  • SDK更新不了问题解决
    问题阐述相信大家在更新SDK的时候都会遇到更新不了的问题,而且打不开Google搜索,这是因为天朝墙了Google,所以要么只能通过科学上网或者改HOSTS才能访问,更新SDK!本节来介绍两种......
  • 牛客小白月赛65 D题 题解
    原题链接题意描述一共有两堆石子,第一堆有\(a\)个,第二堆有\(b\)个,牛牛和牛妹轮流取石子,牛牛先手,每次取石子的时候只能从以下\(2\)种方案种挑一种来取(对于选择的方案......
  • NOI2003 文本编辑器 题解
    \STL大法好/正规解法块状链表,这里采取的是黑科技解法。rope是扩展STL库中的一个数据结构——可持久化平衡树,相比较set,它更适合区间插入和删除。这里用来解此题,就显得十......
  • CF1779C Least Prefix Sum 题解
    可能更好的阅读体验题目传送门题目大意给定一个序列\(a\),长度\(n\)。每次操作可以把\(a_i\)变成\(-a_i\)。要求\(a\)做前缀和之后的序列\(s\)中最小值为\(s......
  • CF1779D Boris and His Amazing Haircut 题解
    可能更好的阅读体验题目传送门题目翻译题目解析如果有\(a_i<b_i\)直接输出NO。我们发现:如果\(b_l=b_r=x\)并且所有的\(l\lei\ler\)都有\(b_i\lex\)那么......
  • CF1779A Hall of Fame 题解
    可能更好的阅读体验题目传送门题目翻译有\(n\)个纪念碑以及对应的\(n\)个台灯。给定一个由L和R组成的序列\(a\),代表台灯的朝向。如果第\(i\)个台灯为L,代......
  • 【题解】P4027 [NOI2007] 货币兑换
    题意好长,但是不想概括了。\cdq/!思路cdq分治+凸包。首先考虑令\(f_i\)表示第\(i\)天可以得到的最大金额,\(f_1=s\)因为\(rate_i\)是常数,并且保证存在最优方......