题意

题目链接

给出一张有向图,以及起点终点,判断每条边的状态:

  1. 是否一定在最短路上,是的话输出'YES'

  2. 如果不在最短路上,最少减去多少权值会使其在最短路上,如果减去后的权值\(< 1\),输出'NO',否则输出'CAN + 花费'

Sol

考察对最短路的理解。

首先确定哪些边一定在最短路上,一个条件是 从起点到该点的最短路 + 边权 + 从该点到终点的最短路 = 从起点到终点的最短路

同时还要满足没有别的边可以代替这条边,可以用Tarjan求一下桥。当然也可以直接用最短路条数判

这样的话正反跑一边Dijkstra求出最短路以及最短路径的条数,判断一下即可

#include<bits/stdc++.h>
#define Pair pair<LL, int>
#define MP make_pair
#define fi first
#define se second
#define LL long long
using namespace std;
const int MAXN = 2e5 + 10;
const LL INF = 1e18 + 10;
const LL mod1 = 2860486313LL, mod2 = 1500450271LL;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, S, T, vis[MAXN];
LL f[MAXN], g[MAXN], f2[MAXN], g2[MAXN];
LL dis[MAXN], rdis[MAXN];
vector<Pair> v[MAXN], t[MAXN];
struct Edge { int u, v; LL w;} E[MAXN];
LL add(LL x, LL y, LL mod) {
return (x + y >= mod ? x + y - mod : x + y);
}
void Dij(int S, LL *d, LL *f, LL *f2, int opt) {
priority_queue<Pair> q; q.push(MP(0, S));
for(int i = 1; i <= N; i++) d[i] = INF;
d[S] = 0; f[S] = f2[S] = 1; memset(vis, 0, sizeof(vis));
while(!q.empty()) {
if(vis[q.top().se]) {q.pop(); continue;}
int p = q.top().se; q.pop(); vis[p] = 1;
vector<Pair> *e = (opt == 1 ? v + p : t + p);
for(int i = 0; i < e -> size(); i++) {
int to = (*e)[i].fi, w = (*e)[i].se;
if(d[to] > d[p] + w) d[to] = d[p] + w, f[to] = f[p], f2[to] = f2[p], q.push(MP(-d[to], to));
else if(d[to] == d[p] + w) f[to] = add(f[to], f[p], mod1), f2[to] = add(f2[to], f2[p], mod2);
}
}
}
signed main() {
N = read(); M = read(); S = read(); T = read();
for(int i = 1; i <= M; i++) {
int x = read(), y = read(), z = read(); E[i] = (Edge) {x, y, z};
v[x].push_back(MP(y, z));
t[y].push_back(MP(x, z));
}
Dij(S, dis, f, f2, 1);
Dij(T, rdis, g, g2, 2);
for(int i = 1; i <= M; i++) {
int x = E[i].u, y = E[i].v;LL w = E[i].w;
if((dis[x] + w + rdis[y] == dis[T]) && (1ll * f[x] * g[y] % mod1 == f[T]) && (1ll * f2[x] * g2[y] % mod2 == f2[T])) puts("YES");
else {
LL ned = dis[T] - dis[x] - rdis[y] ;
if(ned <= 1) puts("NO");
else printf("CAN %I64d\n", w - ned + 1);
}
}
return 0;
}

cf567E. President and Roads(最短路计数)的更多相关文章

  1. CF567E President and Roads

    \(\color{#0066ff}{ 题目描述 }\) 给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到0) \( ...

  2. Codeforces Round #Pi (Div. 2) E. President and Roads 最短路+桥

    题目链接: http://codeforces.com/contest/567/problem/E 题意: 给你一个带重边的图,求三类边: 在最短路构成的DAG图中,哪些边是必须经过的: 其他的(包括 ...

  3. Codeforces.567E.President and Roads(最短路 Dijkstra)

    题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...

  4. Codeforces Round #Pi (Div. 2) E. President and Roads tarjan+最短路

    E. President and RoadsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/567 ...

  5. 【SPFA】 最短路计数

    最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. ...

  6. P1144 最短路计数

    P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...

  7. 洛谷P1144最短路计数题解

    最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...

  8. 洛谷P1144 最短路计数(SPFA)

    To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...

  9. 2018.11.05 NOIP模拟 规避(最短路计数)

    传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...

随机推荐

  1. js 对象 浅拷贝 和 深拷贝

    网上发现一个比较好的博客 阮一峰的感觉很不错推荐大家看看. http://www.ruanyifeng.com/blog/it/javascript/ 接下来看一下这两个拷贝方法 1.浅拷贝 拷贝就是 ...

  2. ASP.Net一般处理程序Session用法

    1.在aspx和aspx.cs中,都是以 Session["type"]="aaa" 和 string aaa=Session["type" ...

  3. Python和qqbot库开发简单的机器人

    from qqbot import QQBotSlot as qqbotslot, RunBot @qqbotslot def onQQMessage(bot, contact, member, co ...

  4. docker image rm ubuntu 失败

    [root@hadoop14 ~]# docker image rm ubuntu Failed to remove image (ubuntu:v2): Error response from da ...

  5. abp学习资料

    参考: https://www.jianshu.com/p/a6e9ace79345

  6. B. Div Times Mod Round #528 (Div. 2)【简单数学】

    一.题面 题目链接 二.分析 一个简单的数学题目,这里首先要把x分解了看 $x = kd + c$ 这样原问题中的n就变成了 $n = dc$ 上面这个式子中,c因为是x除k取余得到的,那么可以肯定 ...

  7. SGU - 495 概率DP

    题意:n个带礼物的盒子和m个人,每个人拿一个盒子并放回,如果里面有礼物就拿走(盒子还是留下),问m个人带走礼物的期望 #include<iostream> #include<algo ...

  8. java代码将excel文件中的内容列表转换成JS文件输出

    思路分析 我们想要把excel文件中的内容转为其他形式的文件输出,肯定需要分两步走: 1.把excel文件中的内容读出来: 2.将内容写到新的文件中. 举例 一张excel表中有一个表格: 我们需要将 ...

  9. hdu1702 ACboy needs your help again!(栈处理)

    ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  10. $bzoj1052-HAOI2007$ 覆盖问题 抽屉原理 二分答案

    题面描述 某人在山上种了\(N\leq 2*10^4​\)棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用\(3​\) ...