cf567E. President and Roads(最短路计数)
题意
给出一张有向图,以及起点终点,判断每条边的状态:
是否一定在最短路上,是的话输出'YES'
如果不在最短路上,最少减去多少权值会使其在最短路上,如果减去后的权值\(< 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(最短路计数)的更多相关文章
- CF567E President and Roads
\(\color{#0066ff}{ 题目描述 }\) 给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到0) \( ...
- Codeforces Round #Pi (Div. 2) E. President and Roads 最短路+桥
题目链接: http://codeforces.com/contest/567/problem/E 题意: 给你一个带重边的图,求三类边: 在最短路构成的DAG图中,哪些边是必须经过的: 其他的(包括 ...
- Codeforces.567E.President and Roads(最短路 Dijkstra)
题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...
- 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 ...
- 【SPFA】 最短路计数
最短路计数 [问题描述] 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式] 输入第一行包含2个正整数N,M,为图的顶点数与边数. ...
- P1144 最短路计数
P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...
- 洛谷P1144最短路计数题解
最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
- 2018.11.05 NOIP模拟 规避(最短路计数)
传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...
随机推荐
- js 对象 浅拷贝 和 深拷贝
网上发现一个比较好的博客 阮一峰的感觉很不错推荐大家看看. http://www.ruanyifeng.com/blog/it/javascript/ 接下来看一下这两个拷贝方法 1.浅拷贝 拷贝就是 ...
- ASP.Net一般处理程序Session用法
1.在aspx和aspx.cs中,都是以 Session["type"]="aaa" 和 string aaa=Session["type" ...
- Python和qqbot库开发简单的机器人
from qqbot import QQBotSlot as qqbotslot, RunBot @qqbotslot def onQQMessage(bot, contact, member, co ...
- docker image rm ubuntu 失败
[root@hadoop14 ~]# docker image rm ubuntu Failed to remove image (ubuntu:v2): Error response from da ...
- abp学习资料
参考: https://www.jianshu.com/p/a6e9ace79345
- B. Div Times Mod Round #528 (Div. 2)【简单数学】
一.题面 题目链接 二.分析 一个简单的数学题目,这里首先要把x分解了看 $x = kd + c$ 这样原问题中的n就变成了 $n = dc$ 上面这个式子中,c因为是x除k取余得到的,那么可以肯定 ...
- SGU - 495 概率DP
题意:n个带礼物的盒子和m个人,每个人拿一个盒子并放回,如果里面有礼物就拿走(盒子还是留下),问m个人带走礼物的期望 #include<iostream> #include<algo ...
- java代码将excel文件中的内容列表转换成JS文件输出
思路分析 我们想要把excel文件中的内容转为其他形式的文件输出,肯定需要分两步走: 1.把excel文件中的内容读出来: 2.将内容写到新的文件中. 举例 一张excel表中有一个表格: 我们需要将 ...
- hdu1702 ACboy needs your help again!(栈处理)
ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- $bzoj1052-HAOI2007$ 覆盖问题 抽屉原理 二分答案
题面描述 某人在山上种了\(N\leq 2*10^4\)棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用\(3\) ...