CF567E President and Roads 最短路+建反边

博客探讨了如何解决CF567E问题,利用Dijkstra算法求解有向图中最短路径,并考虑建立反边以确定哪些边是必经之路。通过比较起点和终点经过特定边的路径成本,判断边权减少的最小值,以确保路径包含该边。代码实现细节也在文中给出。
摘要由CSDN通过智能技术生成

一.题目

传送门
翻译:
给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到0)

二.题解

显然,这道题目要用到建反图的思想。
先处理出起点和终点延正反边到每个点的距离和最短路的方案数
判断一条边要减少多少边权才能一定被使用,就计算起点和终点到这条边两端点的距离和加这条边的边权:
1.如果等于起点到终点的最短距离就将两端点的方案数乘起来:
①如果方案总数等于起点到终点最短路的方案数,那么这条边就可以不做任何改动;
②如果不等于,那么说明这条边可以被替换,就要将它减一。
2.如果大于最短路距离,就直接计算这条边需要减少多少边权才能被用上。
注意每条边的边权不能减为0

三.Code

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

#define LL long long
#define M 100005
const LL mod = 998244353;
const LL INF = 1ll << 50;

struct node {
   
    int v;
    LL Dis;
    node (){
   };
    node (int V, LL DIS){
   
        v = V;
        Dis = DIS;
    }
    bool operator < (const node& rhs) const{
   
        return rhs.Dis < Dis;
    }
};
struct edge {
   
    int v, flag; LL w;
    edge (){
   };
    edge (int V, LL W, int Flag){
   
        v = V;
        w = W;
        flag = Flag;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值