一.题目
传送门
翻译:
给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到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;
}
}