CodeForces 1343E Weights Distributing
题意
多组样例
给定\(n,m,a,b,c\),给定一个长度为\(m\)的数组\(p[]\),给定\(m\)条边,构成一个\(n\)个点\(m\)条边的无向图,\(Mike\)想要从\(a\)走到\(b\),再从\(b\)走到\(c\),你可以在他从\(a\)出发前将\(p[]\)中的值分配到\(m\)条边上,问\(Mike\)最少走多少路程
分析
我们先将所有边的权值赋为\(1\),意为两点间的最小边数为多少
如果\(a\)到\(b\)和\(b\)到\(c\)的最短路不重合,那就直接将两条路上的边从小到大赋值即可,问题在于有重合的部分路径
发现\(\sum n\leq 2\cdot 10^5\),我们可以枚举重合的点\(i\),让\(Mike\)走路径\(a->i->b->i->c\),然后求得边数,其中\(i->b\)的路径为\(p[]\)中最小的几个元素,因为要走两遍,\(i->a\)和\(i->c\)的的路径为剩下元素中最小的元素
由于为无向图,\(i\)到三点距离即为三点到\(i\)距离,为表述方便,皆用\(i\)到三点表述
枚举\(i\)肯定不能以\(i\)为起点求最短路,否则时间复杂度太高,则可以以三点求最短路,然后枚举\(i\)
先计算\(i->a\)的边数,以\(a\)为起点,使用\(Dijkstra\)算法,再计算\(i->b\)的边数,以\(b\)为起点,使用\(Dijkstra\)算法,再计算\(i->c\)的边数,以\(c\)为起点,使用\(Dijkstra\)算法,其中不同的距离设为\(disa[],disb[],disc[]\)
因为是求路径权值和,可直接排序后计算前缀和\(sum[]\)
设\(i->a\)的路径为\(disai\),\(i->\)的b路径为\(disbi\),\(i->c\)的路径为\(disci\),则答案为\(sum[disai + disbi + disci] + sum[disbi]\)的最小值(三边总的前缀和加上\(i->b\)的二次计算)
由于\(i\)到三点的路径不可能有重叠(否则取重叠点可使得答案更小),因此三条路径和小于\(m\),正好使得\(disai + disbi + disci\)不会超出\(sum[]\)的范围
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
#define rep(z, x, y) for(int z=x;z<=y;++z)
#define com bool operator<(const node &b)
using namespace std;
const int maxn = (ll) 2e5 + 5;
const int mod = (ll) 1e9 + 7;
const int inf = 0x3f3f3f3f;
int T = 1;
struct edge {
int v, next, w;
} e[maxn << 1];
struct node {
int dis, u;
bool operator<(const node &b) const {
return dis > b.dis;
}
};
int cnt;
int head[maxn];
int disa[maxn];
int disb[maxn];
int disc[maxn];
bool vis[maxn];
void addedge(int u, int v, int w) {
e[++cnt].next = head[u];
e[cnt].v = v;
e[cnt].w = w;
head[u] = cnt;
e[++cnt].next = head[v];
e[cnt].v = u;
e[cnt].w = w;
head[v] = cnt;
}
int n, m, s;
void dijkstra_a() {
priority_queue<node> q;
disa[s] = 0;
node st;
st.dis = 0;
st.u = s;
q.push(st);
while (!q.empty()) {
node u = q.top();
q.pop();
if (vis[u.u])
continue;
vis[u.u] = true;
for (int i = head[u.u]; ~i; i = e[i].next) {
int v = e[i].v;
if (disa[v] > disa[u.u] + e[i].w) {
disa[v] = disa[u.u] + e[i].w;
node w;
w.dis = disa[v];
w.u = v;
q.push(w);
}
}
}
}
void dijkstra_b() {
priority_queue<node> q;
disb[s] = 0;
node st;
st.dis = 0;
st.u = s;
q.push(st);
while (!q.empty()) {
node u = q.top();
q.pop();
if (vis[u.u])
continue;
vis[u.u] = true;
for (int i = head[u.u]; ~i; i = e[i].next) {
int v = e[i].v;
if (disb[v] > disb[u.u] + e[i].w) {
disb[v] = disb[u.u] + e[i].w;
node w;
w.dis = disb[v];
w.u = v;
q.push(w);
}
}
}
}
void dijkstra_c() {
priority_queue<node> q;
disc[s] = 0;
node st;
st.dis = 0;
st.u = s;
q.push(st);
while (!q.empty()) {
node u = q.top();
q.pop();
if (vis[u.u])
continue;
vis[u.u] = true;
for (int i = head[u.u]; ~i; i = e[i].next) {
int v = e[i].v;
if (disc[v] > disc[u.u] + e[i].w) {
disc[v] = disc[u.u] + e[i].w;
node w;
w.dis = disc[v];
w.u = v;
q.push(w);
}
}
}
}
int num[maxn], sum[maxn];
void solve() {
memset(head, -1, sizeof(head));
cnt = 0;
int a, b, c;
cin >> n >> m >> a >> b >> c;
rep(i, 1, m)cin >> num[i];
sort(num + 1, num + 1 + m);
rep(i, 1, m)sum[i] = sum[i - 1] + num[i];
rep(i, 1, m) {
int u, v;
cin >> u >> v;
addedge(u, v, 1);
}
s = a;
rep(i, 1, n) {
disa[i] = disb[i] = disc[i] = inf;
vis[i] = false;
}
dijkstra_a();
s = b;
rep(i, 1, n)vis[i] = false;
dijkstra_b();
s = c;
rep(i, 1, n)vis[i] = false;
dijkstra_c();
int ans = LLONG_MAX;
rep(i, 1, n) {
int disai = disa[i];
int disbi = disb[i];
int disci = disc[i];
if (disai + disbi + disci > m)
continue;
int now = sum[disai + disbi + disci] + sum[disbi];
ans = min(ans, now);
}
cout << ans << '\n';
}
signed main() {
start;
cin >> T;
while (T--)
solve();
return 0;
}
CodeForces 1343E Weights Distributing的更多相关文章
- 【codeforces 496E】Distributing Parts
[题目链接]:http://codeforces.com/contest/496/problem/E [题意] 给你n个歌曲; 每个歌曲有一个需要声音的区间li,ri; 然后给你m个人; 每个人也有一 ...
- codeforces 496 E. Distributing Parts(贪心+set二分)
题目链接:http://codeforces.com/contest/496/problem/E 题意:有n场演出,每场演出都有限制的高音和低音.然后m个人给出每个人的极限高音和低音还有出场次数. 最 ...
- CF #636 (Div. 3) 对应题号CF1343
unrated 选手悠闲做题,然后只做出四个滚蛋了 符合 div3 一贯风格,没啥难算法 E最后就要调出来了,但还是赛后才A的 CF1343A Candies 传送门 找到一个 \(x\),使得存在一 ...
- [codeforces 339]C. Xenia and Weights
[codeforces 339]C. Xenia and Weights 试题描述 Xenia has a set of weights and pan scales. Each weight has ...
- codeforces 339C Xenia and Weights(dp或暴搜)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Xenia and Weights Xenia has a set of weig ...
- Codeforces 1079 E - The Unbearable Lightness of Weights
E - The Unbearable Lightness of Weights 思路: 分组背包dp 每组最多只能选一个 一些优化可以快很多 代码: #pragma GCC optimize(2) # ...
- Codeforces Round #283 (Div. 2) E. Distributing Parts 贪心+set二分
E. Distributing Parts time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- [Codeforces 496E] Distributing Parts
[题目链接] https://codeforces.com/contest/496/problem/E [算法] 按右端点排序 , 每个乐曲优先选取的左端点最大的演奏家 用std :: set维护贪心 ...
- codeforces 497c//Distributing Parts// Codeforces Round #283(Div. 1)
题意:有n个区间[ai,bi],然后有n个人落在[ci,di],每个人能用ki次.问一种方式站满n个区间. 两种区间都用先x后y的升序排序.对于当前的区间[ai,bi],将ci值小于当前ai的全部放入 ...
- CodeForces 339C Xenia and Weights(暴力求解DFS)
题意:给定 1-10的某几种砝码,给定的每种有无穷多个,然后放 m 个在天平上,要满足,相邻的两次放的砝码不能是同一种,然后是在天平两端轮流放,并且放在哪一个托盘上,那么天平必须是往哪边偏. 析:这个 ...
随机推荐
- 【Linux】详解六种配置Linux环境变量的方法(以centos为例)
本文时间 2023-05-19 作者:sugerqube漆瓷 本文重理解,!!忽略环境变量加载原理!! 本文目标:理解六大环境变量配置,选择合适的配置文件进行配置 配置环境的理由 以shell编程为例 ...
- Python网页开发神器fac 0.2.9、fuc 0.1.29新版本更新内容介绍
fac项目地址:https://github.com/CNFeffery/feffery-antd-components fuc项目地址:https://github.com/CNFeffery/fe ...
- 【python基础】复杂数据类型-列表类型(排序/长度/遍历)
1.列表数据元素排序 在创建的列表中,数据元素的排列顺序常常是无法预测的.这虽然在大多数情况下都是不可避免的,但经常需要以特定的顺序呈现信息.有时候希望保留列表数据元素最初的排列顺序,而有时候又需要调 ...
- 在Istio中,到底怎么获取 Envoy 访问日志?
Envoy 访问日志记录了通过 Envoy 进行请求 / 响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题. 环境准备 部署 httpbin 服务: kubectl apply -f sa ...
- 体验昇腾Ascend C 编程语言极简易用的算子开发
摘要:昇腾Ascend C编程语言,让基于昇腾AI的算法创新更加简单. 本文分享自华为云社区<CANN黑科技解密|昇腾Ascend C编程语言 - 极简易用的算子开发体验>,作者:昇腾CA ...
- 宋红康-Java基础复习笔记详细版
Java基础复习笔记 第01章:Java语言概述 1. Java基础学习的章节划分 第1阶段:Java基本语法 Java语言概述.Java的变量与进制.运算符.流程控制语句(条件判断.循环结构).br ...
- 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题
前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] c ...
- Prometheus-3:一文详解promQL
读前提示: 本文字数较多且紧凑,最好预留15min一次性看完,好营养,易吸收. promQL详解 Prometheus提供了内置的数据查询语言PromQL(全称为Prometheus Query La ...
- 微信小程序生态15- 批量提交微信小程序审核的一种方式
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 以下是『微信小程序生态系列文章』正文! 需求背景 ...
- Raw数据相关概念
什么是"RAW"? 维基百科的字面解释是:原始图像文件包含从数码相机.扫描器或电影胶片扫描仪的图像传感器所处理数据.RAW文件包含创建一个可视图像所必须的相机传感器数据信息. 通俗 ...