题意

多组样例

给定\(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的更多相关文章

  1. 【codeforces 496E】Distributing Parts

    [题目链接]:http://codeforces.com/contest/496/problem/E [题意] 给你n个歌曲; 每个歌曲有一个需要声音的区间li,ri; 然后给你m个人; 每个人也有一 ...

  2. codeforces 496 E. Distributing Parts(贪心+set二分)

    题目链接:http://codeforces.com/contest/496/problem/E 题意:有n场演出,每场演出都有限制的高音和低音.然后m个人给出每个人的极限高音和低音还有出场次数. 最 ...

  3. CF #636 (Div. 3) 对应题号CF1343

    unrated 选手悠闲做题,然后只做出四个滚蛋了 符合 div3 一贯风格,没啥难算法 E最后就要调出来了,但还是赛后才A的 CF1343A Candies 传送门 找到一个 \(x\),使得存在一 ...

  4. [codeforces 339]C. Xenia and Weights

    [codeforces 339]C. Xenia and Weights 试题描述 Xenia has a set of weights and pan scales. Each weight has ...

  5. codeforces 339C Xenia and Weights(dp或暴搜)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Xenia and Weights Xenia has a set of weig ...

  6. Codeforces 1079 E - The Unbearable Lightness of Weights

    E - The Unbearable Lightness of Weights 思路: 分组背包dp 每组最多只能选一个 一些优化可以快很多 代码: #pragma GCC optimize(2) # ...

  7. 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 ...

  8. [Codeforces 496E] Distributing Parts

    [题目链接] https://codeforces.com/contest/496/problem/E [算法] 按右端点排序 , 每个乐曲优先选取的左端点最大的演奏家 用std :: set维护贪心 ...

  9. codeforces 497c//Distributing Parts// Codeforces Round #283(Div. 1)

    题意:有n个区间[ai,bi],然后有n个人落在[ci,di],每个人能用ki次.问一种方式站满n个区间. 两种区间都用先x后y的升序排序.对于当前的区间[ai,bi],将ci值小于当前ai的全部放入 ...

  10. CodeForces 339C Xenia and Weights(暴力求解DFS)

    题意:给定 1-10的某几种砝码,给定的每种有无穷多个,然后放 m 个在天平上,要满足,相邻的两次放的砝码不能是同一种,然后是在天平两端轮流放,并且放在哪一个托盘上,那么天平必须是往哪边偏. 析:这个 ...

随机推荐

  1. JSPModel

    JSPModel what JSP开发模型就是JSP Model,是用JSP语言写的 why 为了更好地使用jsp技术开发 How JSPModel1 Why 因为在jsp开发中,包含了数据处理/业务 ...

  2. ODOO升级模块后到系统进入不了,报错500

    有时候安装后者升级odoo相关模块后会导致系统进入不了,报错500,此时我们可以通过Odoo命令行卸载相关模块 此方法适用于在安装或升级某个模块后导致崩库,进不去桌面的情况下使用.原理是通过odoo- ...

  3. 基于SqlSugar的开发框架循序渐进介绍(30)-- 整合客户关系管理系统模块功能

    以前在随笔<Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示 >的几篇随笔中介绍过基于WInform开发框架开发的CRM系统,系统的功能主要也是围绕着客户相 ...

  4. 基于SqlSugar的开发框架循序渐进介绍(31)-- 在查询接口中实现多表联合和单表对象的统一处理

    在一些复杂的业务表中间查询数据,有时候操作会比较复杂一些,不过基于SqlSugar的相关操作,处理的代码会比较简单一些,以前我在随笔<基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中 ...

  5. 【Python&GIS】通过经纬度创建矢量点文件

         最近在做项目时,需要判断某个点是否在感兴趣区内.所以需要使用Python先根据经纬度的点创建矢量文件,再通过点文件和面文件的位置关系判断点是否在面内.         这里我们使用osgeo ...

  6. 云上使用 Stable Diffusion ,模型数据如何共享和存储

    随着人工智能技术的爆发,内容生成式人工智能(AIGC)成为了当下热门领域.除了 ChatGPT 之外,文本生成图像技术更令人惊艳. Stable Diffusion,是一款开源的深度学习模型.与 Mi ...

  7. 关于SQL SERVER ROW_NUMBER(),RANK(),DENSE_RANK() 的排序和分页查询问题

    经常接触SQL SERVER 的朋友来说,排序是经常遇见的问题,有的人还会傻傻自己写排序,比如用循环去写,当然这就比较难受 今天就给大家介绍一下SQL SERVER 自带的排序,共有三种,分别为ROW ...

  8. Git存储

    Git还提供了一个贮藏的功能.如果你某个分支开发过程中,这个分支的内容是要在本月月底上线的,但是生产上已经出现了一个重大bug,需要你立马去修复.你在分支开发的内容已经开发一部分了,工作区有内容是不能 ...

  9. 【阅读笔记】Rapid, Detail-Preserving Image Downscaling

    Rapid, Detail-Preserving Image Downscaling(快速的图像缩放技术) 该论文提出了一种基于卷积滤波器的算法,并确定滤波器的权值,使重要的细节保留在缩小比例的图像. ...

  10. 【MAUI Blazor踩坑日记】6.mac标题栏颜色修改

    MAUI中mac的标题栏颜色默认是灰白色的,有一点丑 如果我们想要自定义颜色,并且在运行时也能更改颜色,该怎么办呢 万幸从一个GitHub库中借鉴到了办法 https://github.com/Ben ...