前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【CodeForces 567E】President and Roads(最短路)

【CodeForces 567E】President and Roads(最短路)

作者头像
饶文津
发布2020-06-02 15:52:18
6370
发布2020-06-02 15:52:18
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

Description

Berland has n cities, the capital is located in city s, and the historic home town of the President is in city t (s ≠ t). The cities are connected by one-way roads, the travel time for each of the road is a positive integer.

Once a year the President visited his historic home town t, for which his motorcade passes along some path from s to t (he always returns on a personal plane). Since the president is a very busy man, he always chooses the path from s to t, along which he will travel the fastest.

The ministry of Roads and Railways wants to learn for each of the road: whether the President will definitely pass through it during his travels, and if not, whether it is possible to repair it so that it would definitely be included in the shortest path from the capital to the historic home town of the President. Obviously, the road can not be repaired so that the travel time on it was less than one. The ministry of Berland, like any other, is interested in maintaining the budget, so it wants to know the minimum cost of repairing the road. Also, it is very fond of accuracy, so it repairs the roads so that the travel time on them is always a positive integer.

Input

The first lines contain four integers nms and t (2 ≤ n ≤ 105; 1 ≤ m ≤ 105; 1 ≤ s, t ≤ n) — the number of cities and roads in Berland, the numbers of the capital and of the Presidents' home town (s ≠ t).

Next m lines contain the roads. Each road is given as a group of three integers ai, bi, li (1 ≤ ai, bi ≤ nai ≠ bi; 1 ≤ li ≤ 106) — the cities that are connected by the i-th road and the time needed to ride along it. The road is directed from city ai to city bi.

The cities are numbered from 1 to n. Each pair of cities can have multiple roads between them. It is guaranteed that there is a path from sto t along the roads.

Output

Print m lines. The i-th line should contain information about the i-th road (the roads are numbered in the order of appearance in the input).

If the president will definitely ride along it during his travels, the line must contain a single word "YES" (without the quotes).

Otherwise, if the i-th road can be repaired so that the travel time on it remains positive and then president will definitely ride along it, print space-separated word "CAN" (without the quotes), and the minimum cost of repairing.

If we can't make the road be such that president will definitely ride along it, print "NO" (without the quotes).

Examples

input

代码语言:javascript
复制
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

output

代码语言:javascript
复制
YES
CAN 2
CAN 1
CAN 1
CAN 1
CAN 1
YES

input

代码语言:javascript
复制
3 3 1 3
1 2 10
2 3 10
1 3 100

output

代码语言:javascript
复制
YES
YES
CAN 81

input

代码语言:javascript
复制
2 2 1 2
1 2 1
1 2 2

output

代码语言:javascript
复制
YES
NO

Note

The cost of repairing the road is the difference between the time needed to ride along it before and after the repairing.

In the first sample president initially may choose one of the two following ways for a ride:1 → 2 → 4 → 5 → 6 or 1 → 2 → 3 → 5 → 6.

dijkstra找出从s出发的最短路和从t出发的最短路。

存边的时候正向和逆向分别存起来,并且在求最短路的同时计算到每个点的最短路数量。

d[0][i]表示s出发到i的最短路,d[1][i]表示t出发到i的最短路。每条边的权值为w。

则当w+d[0][u]+d[1][v]时说明是s到t的最短路上的边,如果是所有最短路都经过的边,则满足path[0][u]*path[1][v]==path[0][t]。

path是最短路的数量,因为可能爆long long,因此要取模,而且还不能是1000000007。

代码语言:javascript
复制
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #include <algorithm>
 6 #define N 100005
 7 #define M 5462617
 8 #define inf 0x3f3f3f3f3f3f3f3fll
 9 #define ll long long
10 #define add(u,v,w) e[++cnt]=(edge){v,head[0][u],w};head[0][u]=cnt;e[++cnt]=(edge){u,head[1][v],w};head[1][v]=cnt
11 using namespace std;
12 struct edge{
13     ll to,next,w;
14 }e[N<<1];
15 struct road{
16     ll u,v,w;
17 }l[N];
18 struct qnode{
19     ll v,c;
20     bool operator <(const qnode &r)const{
21         return c>r.c;
22     }
23 };
24 ll n,m,s,t,u,v,w,d[2][N],cnt,head[2][N],b[2][N],path[2][N];
25 void dijkstra(int f){
26     int i,j,k,pr=f?t:s;
27     for(i=1;i<=n;i++)d[f][i]=inf;
28     priority_queue<qnode> q;
29     d[f][pr]=0;
30     q.push((qnode){pr,0});
31     path[f][pr]=1;
32     while(!q.empty()){
33         qnode u=q.top();
34         q.pop();
35         if(b[f][u.v])continue;
36         b[f][pr=u.v]=1;
37         for(j=head[f][pr];j;j=e[j].next){
38             k=e[j].to;
39             if(d[f][pr]+e[j].w==d[f][k])
40                 path[f][k]=(path[f][k]+path[f][pr])%M;
41             else if(d[f][pr]+e[j].w<d[f][k]){
42                 d[f][k]=d[f][pr]+e[j].w;
43                 q.push((qnode){k,d[f][k]});
44                 path[f][k]=path[f][pr];
45             }
46         }
47     }
48 }
49 int main() {
50     int i,j;
51     cin>>n>>m>>s>>t;
52     for(i=1;i<=m;i++){
53         scanf("%lld%lld%lld",&u,&v,&w);
54         add(u,v,w);
55         l[i]=(road){u,v,w};
56     }
57     dijkstra(0);
58     dijkstra(1);
59     for(i=1;i<=m;i++)
60     {
61         u=l[i].u;
62         v=l[i].v;
63         w=l[i].w;
64         if(d[0][u]+d[1][v]+w==d[0][t]){
65             if(path[0][u]*path[1][v]%M==path[0][t])
66                 puts("YES");
67             else if(w>1)
68                 puts("CAN 1");
69             else puts("NO");
70         }
71         else if(d[0][u]+d[1][v]+1<d[0][t])
72             printf("CAN %lld\n",d[0][u]+d[1][v]+w-d[0][t]+1);
73         else 
74             puts("NO");
75     }
76 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-08-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档