E. Weights Distributing(图论)

博客详细介绍了E. Weights Distributing的图论问题,探讨了从点a到点c经过点b时,如何通过贪心策略分配路径权重以达到最小总花费。首先假设路径为直线,然后分析当路径有重合时如何优化。博主通过计算各点间的最短距离,并应用贪心和前缀和的方法实现解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

E. Weights Distributing(图论,贪心)

题目传送门:

E. Weights Distributing

题目大意:

有n个点,m条路径,每次经过一条路径时都需要一次该路径的花费。有一个花费数组对应着每一条路径,要求给出一个权值分配方案使得从点a->b->c的花费最小为多少。

思路:

1.假设a->b之后b->c没有经过之前经过的点,那么也就是三点之间经过的路径是一条直线。
2.否则b->c经过了之前经过的x,那么也就有了a->x->b->x->c的路径。
那么b->x这一段路径经过了两次,所以我们优先给这一段路径分配权值,然后再为另外两段路径分配权值。

先求出a,b,c三点到其他点的最短距离,然后将花费数组贪心之后用前缀和优化一下即可。

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
int dis[4][N];//a,b,c三个点到每个点的距离
LL sum[N],price[N];
vector<int>g[N];
struct node
{
   
    int to,dist;
};
priority_queue<node>que;
bool operator<(const node &p,const node &q)
{
   
    return p.dist>q.dist;
}
void dijkstra(int idx,int num)
{
   
    dis[idx][num]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值