CF567E President and Roads
\(\color{#0066ff}{ 题目描述 }\)
给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到0)
\(\color{#0066ff}{输入格式}\)
第一行包含四个整数n,m,s和t(\(2 \leq n \leq 10^5; 1 \leq m \leq 10^5,1 \leq s, t \leq n\)) -在BERLAND城市,道路的数量,首都和总统家乡(s ≠ t)。
接下来的m条线路包含道路。各道路被给定为一组三个整数ai, bi, li (1 ≤ ai, bi ≤ n; ai ≠ bi; 1 ≤ li ≤ \(10^6\)) -由连接在城市第i条道路以及骑行所需的时间。道路从城市a 直达城市b i。
城市编号从1到n。每对城市之间可以有多条道路。保证沿着道路有从s到t的路径
\(\color{#0066ff}{输出格式}\)
打印m行。第i行应包含有关第i条道路的信息(道路按出现在输入中的顺序编号)。
如果总统在旅行期间肯定会骑它,则该行必须包含一个单词“ 是 ”(没有引号)。
否则,如果能够修复第i条道路,使其上的旅行时间保持正面,那么总统肯定会骑在它上面,打印空格分隔的单词“ CAN ”(不带引号)以及修复的最小费用。
如果我们不能让总统肯定会骑在这条路上,请打印“ 否 ”(没有引号)。
注意 修复道路的费用是修复前后骑车所需的时间之差。
\(\color{#0066ff}{输入样例}\)
6 7 1 6
1 2 2
1 3 10
2 3 7
2 4 8
3 5 3
4 5 2
5 6 1
3 3 1 3
1 2 10
2 3 10
1 3 100
2 2 1 2
1 2 1
1 2 2
\(\color{#0066ff}{输出样例}\)
YES
CAN 2
CAN 1
CAN 1
CAN 1
CAN 1
YES
YES
YES
CAN 81
YES
NO
\(\color{#0066ff}{数据范围与提示}\)
none
\(\color{#0066ff}{ 题解 }\)
从S正向建图跑DIJ,从T反向建图跑DIJ
考虑一个边,如果一定在最短路上首先用两端点dis+边权判断,然后如果是必经边,显然是最短路树上的割边
然而好像写挂了qwq
还有一种方法是利用最短路计数来算
一条边必经,当且仅当\(diss[x]+dist[y]+z=diss[t] \&\&cnts[x]*cntt[y]=cnts[t]\)
但是cnt会炸LL
于是开始取模
然而这题TM还卡模数,调了好久
对于非必经边,若让它必经,显然让它减小一些权值使得恰好比最短路小1就行了
判断一下是否到0就行
#include<bits/stdc++.h>
#define LL long long
#define int long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
using std::pair;
using std::make_pair;
const int mox = 998244353;
const int mod = 1004535809;
const int maxn = 1e5 + 200;
const LL inf = 999999999999999LL;
struct node {
int to;
LL dis;
node *nxt;
node(int to = 0, LL dis = 0, node *nxt = NULL): to(to), dis(dis), nxt(nxt) {}
void *operator new(size_t) {
static node *S = NULL, *T = NULL;
return (S == T) && (T = (S = new node[1024]) + 1024), S++;
}
};
struct E {
LL x, y, z;
}e[maxn];
int n, m, S, T;
node *head[maxn], *h[maxn];
LL diss[maxn], dist[maxn], cnts[maxn], cntt[maxn], cntss[maxn], cnttt[maxn];
bool vis[maxn];
std::priority_queue<pair<LL, int>, std::vector<pair<LL, int> >, std::greater<pair<LL, int> > > q;
void add(int from, int to, int dis, node **hh) {
hh[from] = new node(to, dis, hh[from]);
}
void dij(int s, LL *dis, node **hh, LL *cnt, LL *ccnt) {
for(int i = 1; i <= n; i++) dis[i] = inf, vis[i] = false;
q.push(make_pair(dis[s] = 0, s));
cnt[s] = 1;
while(!q.empty()) {
int tp = q.top().second; q.pop();
if(vis[tp]) continue;
vis[tp] = true;
for(node *i = hh[tp]; i; i = i->nxt) {
if(dis[i->to] > dis[tp] + i->dis)
q.push(make_pair(dis[i->to] = dis[tp] + i->dis, i->to)), cnt[i->to] = cnt[tp] % mod, ccnt[i->to] = ccnt[tp] % mox;
else if(dis[i->to] == dis[tp] + i->dis) (cnt[i->to] += cnt[tp]) %= mod, (ccnt[i->to] += ccnt[tp]) %= mox;
}
}
}
signed main() {
n = in(), m = in(), S = in(), T = in();
for(int i = 1; i <= m; i++) {
E &o = e[i];
o.x = in(), o.y = in(), o.z = in();
add(o.x, o.y, o.z, head);
add(o.y, o.x, o.z, h);
}
dij(S, diss, head, cnts, cntss);
dij(T, dist, h, cntt, cnttt);
for(int i = 1; i <= m; i++) {
E o = e[i];
if(diss[o.x] + dist[o.y] + o.z == diss[T] && (cnts[o.x] * cntt[o.y] % mod) == (cnts[T] % mod) && (cntss[o.x] * cnttt[o.y] % mod) == (cntss[T] % mod)) printf("YES\n");
else {
LL now = diss[o.x] + dist[o.y] + o.z;
LL goal = diss[T] - 1;
LL dt = now - goal;
if(o.z - dt <= 0) printf("NO\n");
else printf("CAN %lld\n", dt);
}
}
return 0;
}
CF567E President and Roads的更多相关文章
- cf567E. President and Roads(最短路计数)
题意 题目链接 给出一张有向图,以及起点终点,判断每条边的状态: 是否一定在最短路上,是的话输出'YES' 如果不在最短路上,最少减去多少权值会使其在最短路上,如果减去后的权值\(< 1\),输 ...
- 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 ...
- 【CodeForces 567E】President and Roads(最短路)
Description Berland has n cities, the capital is located in city s, and the historic home town of th ...
- Codeforces Round #Pi (Div. 2) E. President and Roads 最短路+桥
题目链接: http://codeforces.com/contest/567/problem/E 题意: 给你一个带重边的图,求三类边: 在最短路构成的DAG图中,哪些边是必须经过的: 其他的(包括 ...
- codeforces567E. President and Roads
题目大意:总统要回家,会经过一些街道,每条街道都是单向的并且拥有权值.现在,为了让总统更好的回家,要对每一条街道进行操作:1)如果该街道一定在最短路上,则输出“YES”.2)如果该街道修理过后,该边所 ...
- Codeforces.567E.President and Roads(最短路 Dijkstra)
题目链接 \(Description\) 给定一张有向图,求哪些边一定在最短路上.对于不一定在最短路上的边,输出最少需要将其边权改变多少,才能使其一定在最短路上(边权必须为正,若仍不行输出NO). \ ...
- Codeforces Round #Pi (Div. 2) 567E President and Roads ( dfs and similar, graphs, hashing, shortest paths )
图给得很良心,一个s到t的有向图,权值至少为1,求出最短路,如果是一定经过的边,输出"YES",如果可以通过修改权值,保证一定经过这条边,输出"CAN",并且输 ...
- codeforces 567 E. President and Roads 【 最短路 桥 】
给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到0) 正反向建图,分别求出起点到每个点的最短距离,终点到每个点的最 ...
- 【Henu ACM Round#14 F】 President and Roads
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到 ...
随机推荐
- 9个步骤:教你设计出优秀的MMORPG副本关卡
转自:http://www.gameres.com/664485.html 副本的定义 以一张场景地图为原型,针对单个玩家.队伍或者团队生成的一个实例,包含完整的开启关闭.怪物刷新.进度记录等逻辑. ...
- Xcode的Refactor使用
最近在看<重构>的书,想到Xcode有一个Refactor的功能,不知道您用的多不多,用这个功能在我们开发过程中,可以提高开发效率. Refactor 右键显示 Refactor 一.Re ...
- Activity的显式跳转和隐式挑战
安卓中Activity的跳转几乎是每一个APP都会用到的技术点.而且他的使用时十分简单的. 这里我们先说一下主要的技术要点: 1.在清单文件中注册新的Activity 2.通过意图跳转 这里我们看一下 ...
- 用于确保页面中js加载完全,对于优化某网页的加载速度,有什么见解
js方法: <script type="text/javascript"> window.onload = function(){ var userName = &qu ...
- Windows10更新后无限重启
以安全模式进入系统,禁用或卸载显卡驱动. 重启后重新安装驱动.
- Android ListView 设置
android:minHeight="80dip"//设置每一条的高度 android:divider="@null" //设置默认的分割线不显示 androi ...
- Nginx --Windows下和Linux下搭建集群小记
nginx: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器 特点: 反向代理 负载均衡 动静分离... 反向代理 : 先来了解正向代理:需要我们用户 ...
- vue 的全局拦截器
使用拦截器 你可以截取请求或响应在被 then 或者 catch 处理之前 mounted:function(){ Vue.http.inserceptors.push(function(resque ...
- 20、Basic Shell_for_while_grep_find
转载:https://github.com/swcarpentry/DEPRECATED-boot-camps/blob/master/shell/shell_cheatsheet.md 1.For ...
- bzoj1735 [Usaco2005 jan]Muddy Fields 泥泞的牧场
传送门 分析 我们知道对于没有障碍的情况就是将横轴点于纵轴点连边 于是对于这种有障碍的情况我们还是分横轴纵轴考虑 只不过对于有障碍的一整条分为若干个无障碍小段来处理 然后将标号小段连边,跑最大匹配即可 ...