Codeforces 545E Paths and Trees 题解

news/2024/12/22 2:35:55/

文章目录

    • 题意
    • 题解

题意

给 一 张 边 带 权 无 向 图 , 让 你 求 一 棵 边 权 和 最 小 的 生 成 树 , 使 得 点 u 在 树 上 到 每 个 点 的 距 离 等 于 u 在 原 图 中 到 每 个 点 的 最 短 路 . 给 出 这 张 图 和 u , 输 出 最 小 边 权 和 以 及 构 成 这 棵 生 成 树 的 边 集 . 给一张边带权无向图,让你求一棵边权和最小的生成树,使得\newline 点u在树上到每个点的距离等于u在原图中到每个点的最短路.\newline 给出这张图和u,输出最小边权和以及构成这棵生成树的边集. ,,使uu.u,.

题解

大胆贪心,把每一个点相连的最短路上的边相加.
注意最短路算法中进行的松弛操作.
我们对经过每一个点的最短路上的边标记为 e i d v eid_v eidv.
那么在跑最短路的时候,如果 d i s [ v ] > d i s [ u ] + c o s t dis[v]>dis[u]+cost dis[v]>dis[u]+cost,那么 e i d [ v ] = i . i d eid[v]=i.id eid[v]=i.id,即这条边的编号.
如果 d i s [ v ] = d i s [ u ] + c o s t dis[v]=dis[u]+cost dis[v]=dis[u]+cost,我们就贪心选较短的边.
这样下去除了起始点 u u u的所有点 v v v e i d eid eid组成的集合即为答案.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rel register ll
#define rec register char
#define gc getchar
//#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<23,stdin),p1==p2)?-1:*p1++)
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
char buf[1<<23],*p1=buf,*p2=buf;
inline int read(){int x=0,f=1;char c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return f?x:-x;}
template <typename mitsuha>
inline bool read(mitsuha &x){x=0;int f=1;char c=gc();for (;!isdigit(c)&&~c;c=gc()) f^=c=='-';if (!~c) return 0;for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return x=f?x:-x,1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return 0&pc(48);if (x<0) pc('-'),x=-x;int bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);return 0;}
inline char fuhao(){char c=gc();for (;isspace(c);c=gc());return c;}
}using namespace chtholly;
using namespace std;
const int yuzu=3e5,inf=0x3f3f3f3f;
typedef int fuko[yuzu|10];
typedef ll rize[yuzu|10];
struct edge{int to,cost,id;}e[yuzu|10];
vector<edge> lj[yuzu|10];vector<int> ans;
namespace {
rize dis; fuko eid,vis; 
void spfa(int s) {memset(dis,0x3f,sizeof dis);queue<int> q;dis[s]=0,q.push(s);for (;!q.empty();) {int u=q.front(); q.pop();vis[u]=0;for (edge i:lj[u]) {int v=i.to; ll c=i.cost;if (dis[u]+c==dis[v]&&e[eid[v]].cost>c){eid[v]=i.id;if (!vis[v]) q.push(v),vis[v]=1;}if (dis[v]>dis[u]+c) {dis[v]=dis[u]+c;eid[v]=i.id;if (!vis[v]) q.push(v),vis[v]=1;}}}}
}int main() {
int i,n,m,u,v,c;
read(n),read(m);
for (i=1;i<=m;++i) {read(u),read(v),read(c);lj[u].push_back(edge{v,c,i});lj[v].push_back(edge{u,c,i});e[i]=edge{v,c,i};}
e->cost=inf;
spfa(read());
ll llx=0;
for (i=1;i<=n;++i) if (eid[i]) ans.push_back(eid[i]),llx+=e[eid[i]].cost;
cout<<llx<<endl;
for (auto p:ans) write(p),p32;
}

谢谢大家.


http://www.ppmy.cn/news/158571.html

相关文章

笔记本电脑更换固态硬盘教程(联想ThinkPadE455)

一、制作重装系统的系统启动盘 雨林木风win10专业纯净版64位 在雨林木风官网 老毛桃制作系统启动盘教程 百度一下 二、拆机 thinkpad E455拆机教程 百度经验 注&#xff1a;只拆开&#xff0c;不清灰&#xff0c;只照做到第三步即可。 三、更换硬盘 1.用螺丝刀将硬盘…

Thinkpad E545扩展内存条后蓝屏问题解决

最近新买了个Thinkpad E545同时我也扩展内存到8G&#xff0c;当时供应商是先做的系统&#xff0c;系统是WIN7 64位&#xff0c;后安装的内存条。当时随便点了点没有发现什么异常情况。 晚上回家后安装各种常用的软件&#xff0c;尤其登陆QQ后&#xff0c;QQ持续性的崩溃&#…

ThinkPad E445 E545如何正确开启硬件虚拟化

在BIOS中虚拟化改为Enable了&#xff0c;但是我用VMware安装虚拟机时提示虚拟化已禁用&#xff0c; 解决方案: 将BIOS中security--Virtualization--AMD V&#xff08;TM&#xff09; Technology禁用之后使用正常。 此情况可能为BIOS中选项错误导致&#xff0c;默认为Disabled…

ThinkPad E545连WiFi教程(系统:ubuntu-20.04.3-live-server,无线网卡:BCM34142)

PS&#xff1a;需要在有线网络能用的情况下进行&#xff01; 安装工具&#xff1a;apt install -y net-tools wireless-tools network-manager 安装网卡驱动&#xff1a;apt install -y --reinstall bcmwl-kernel-source 查看无线网卡信息&#xff1a;iwconfig&#xff08;获…

TextCNN:用于文本分类的CNN网络

参考资料&#xff1a;文本分类之TextCNN与DPCNN TextCNN 是在2014年的论文 《Convolutional Neural Networks for Sentence Classification》中提出来的。 以下是TextCNN的网络结构&#xff1a; &#xff08;1&#xff09;TextCNN的第一层为 Embedding 层 Embedding 层的输入…

【01JavaScript简介】JavaScript之初探:入门指南与基础概述

JavaScript简介 php Copy code JavaScript是一种具有广泛应用的脚本语言&#xff0c;主要用于前端开发&#xff0c;可以为网页增加交互性和动态性。它由Netscape公司的Brendan Eich于1995年创建&#xff0c;并迅速成为Web开发中不可或缺的一部分。 JavaScript的特点 JavaScr…

【2023】华为OD机试真题全语言-题目0244-Linux发行版的数量

题目0244-Linux发行版的数量 题目描述 Linux 操作系统有多个发行版,distrowatch.com 提供了各个发行版的资料。这些发行版互相存在关联,例如 Ubuntu 基于Debian 开发,而 Mint 又基于 Ubuntu 开发,那么我们认为 Mint 同 Debian 也存在关联。 发行版集是一个或多个相关存在…

《MYSQL必知必会》读书笔记2

哈夫曼树的学习&#xff1a; http://t.csdn.cn/XJhUI 创建计算字段 字段&#xff1a;基本上与列的意思相同&#xff08;数据库列一般称为列&#xff0c;而字段通常用于计算字段连接上&#xff09; 拼接字段 拼接&#xff1a;将值联结到一起构成单个值 把两个结拼接起来&a…