题目大意:总统要回家,会经过一些街道,每条街道都是单向的并且拥有权值。现在,为了让总统更好的回家,要对每一条街道进行操作:1)如果该街道一定在最短路上,则输出“YES”。2)如果该街道修理过后,该边所在的最短路可以取代原先的最短路,则输出“CAN x”,x是修改该街道的花费,就是权值减小的值。3)如果该街道是一条不连通的街道,或者修改过后权值小于等于0,则输出“NO”。

解题思路:正向取边,求一次最短路得到d1[], 然后反向取边,再求一次最短路得到d2[]。接着开始判断每一条边是否在最短路上。初始最短路为Min,当d1[u]+d2[v]+dis==Min时,先判断该边是否一定为最短路上的边,是的话输出“YES”,否则在判断该边的权值是否大于1,是的话输出“CAN 1”,否则输出“NO”。当d1[u]+d2[v]+dis>Min时,先判断两段路的差值加一是否会大于等于该边的差值,是的话,输出“NO”,否则输出“CAN 差值加一”,其余情况均输出“NO”。还有一个问题,如何判断边是否一定在最短路上。先把最短路取出,重新建一张无向图,然后用tarjan算法求出哪些边是桥。桥就是一定在最短路上的边。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 200005
#define maxm 200005
#define inf 4557430888798830399LL
using namespace std;
typedef long long int64;
char ch;
int n,m,s,t,a[maxm],b[maxm],idx,dfn[maxn],low[maxn];
int64 c[maxm],min_road;
int siz,pos[maxn];
struct Heap{
int64 val;
int num;
bool operator <(const Heap b)const{return val<b.val;}
bool operator >(const Heap b)const{return b<*this;}
bool operator <=(const Heap b)const{return !(*this>b);}
bool operator >=(const Heap b)const{return !(*this<b);}
bool operator ==(const Heap b)const{return (*this<=b)&&(*this>=b);}
bool operator !=(const Heap b)const{return !(*this==b);}
}heap[maxn],tmp;
struct Map{
int tot,now[maxn],son[maxm],pre[maxm],val[maxm];
int64 dist[maxn];
void put(int a,int b,int c){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c;}
}map[];
bool ok,bo[maxn],road[maxm];
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
void read(int64 &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
void heap_swap(Heap &a,Heap &b){swap(pos[a.num],pos[b.num]),swap(a,b);}
void up(int son){
int fa=son>>;
while (fa){
if (heap[fa]<=heap[son]) break;
heap_swap(heap[fa],heap[son]);
son=fa,fa>>=;
}
}
void down(){
int fa=,son=fa<<;
while (son<=siz){
if (son+<=siz&&heap[son+]<heap[son]) son++;
if (heap[fa]<=heap[son]) break;
heap_swap(heap[fa],heap[son]);
fa=son,son<<=;
}
}
void dijkstra(Map &map,int s){
siz=n;
memset(map.dist,,sizeof(map.dist));
memset(bo,,sizeof(bo));
for (int i=;i<=n;i++) heap[i].val=inf;
for (int i=;i<=n;i++) heap[i].num=i;
for (int i=;i<=n;i++) pos[i]=i;
heap[s].val=,up(pos[s]);
for (;;){
if (heap[].val==inf||!siz) break;
int u=heap[].num;
bo[u]=true,map.dist[u]=heap[].val;
heap_swap(heap[],heap[siz--]),down();
for (int p=map.now[u],v=map.son[p];p;p=map.pre[p],v=map.son[p]){
if (heap[pos[v]].val>map.dist[u]+map.val[p]&&!bo[v])
heap[pos[v]].val=map.dist[u]+map.val[p],up(pos[v]);
}
}
}
void dfs(Map &map,int u,int t){
dfn[u]=low[u]=++idx;
for (int p=map.now[u],v=map.son[p];p;p=map.pre[p],v=map.son[p])
if (!dfn[v]){
dfs(map,v,p^),low[u]=min(low[u],low[v]);
if (low[v]>dfn[u]) road[pos[p>>]]=;
}
else if (t!=p) low[u]=min(low[u],dfn[v]);
}
int main(){
read(n),read(m),read(s),read(t);
for (int i=;i<=m;i++) read(a[i]),read(b[i]),read(c[i]),map[].put(a[i],b[i],c[i]),map[].put(b[i],a[i],c[i]);
dijkstra(map[],s),dijkstra(map[],t),min_road=map[].dist[t],map[].tot=;
for (int i=;i<=m;i++) if (map[].dist[a[i]]+map[].dist[b[i]]+c[i]==min_road)
map[].put(a[i],b[i],c[i]),map[].put(b[i],a[i],c[i]),pos[map[].tot>>]=i;//,cout<<a[i]<<' '<<b[i]<<endl;
dfs(map[],s,-);
for (int i=;i<=m;i++)
if (map[].dist[a[i]]+map[].dist[b[i]]+c[i]==min_road){
if (road[i]) puts("YES");
else if (c[i]>) puts("CAN 1");
else puts("NO");
}
else if (map[].dist[a[i]]+map[].dist[b[i]]+c[i]>min_road){
if (min_road>map[].dist[a[i]]+map[].dist[b[i]]+) printf("CAN %I64d\n",map[].dist[a[i]]+map[].dist[b[i]]+c[i]-min_road+);
else puts("NO");
}
else puts("NO");
return ;
}

codeforces567E. President and Roads的更多相关文章

  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 ...

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

    Description Berland has n cities, the capital is located in city s, and the historic home town of th ...

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

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

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

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

  5. cf567E. President and Roads(最短路计数)

    题意 题目链接 给出一张有向图,以及起点终点,判断每条边的状态: 是否一定在最短路上,是的话输出'YES' 如果不在最短路上,最少减去多少权值会使其在最短路上,如果减去后的权值\(< 1\),输 ...

  6. CF567E President and Roads

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

  7. Codeforces Round #Pi (Div. 2) 567E President and Roads ( dfs and similar, graphs, hashing, shortest paths )

    图给得很良心,一个s到t的有向图,权值至少为1,求出最短路,如果是一定经过的边,输出"YES",如果可以通过修改权值,保证一定经过这条边,输出"CAN",并且输 ...

  8. codeforces 567 E. President and Roads 【 最短路 桥 】

    给出一个有向图,从起点走到终点(必须走最短路),问一条边是否一定会被经过,如果不经过它,可以减小它的多少边权使得经过它(边权不能减少到0) 正反向建图,分别求出起点到每个点的最短距离,终点到每个点的最 ...

  9. 【Henu ACM Round#14 F】 President and Roads

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到 ...

随机推荐

  1. SRM 500(2-1000pt)

    DIV2 1000pt 题意:给定两个集合A和B,A = {b1*q1i | 0 <= i <= n1-1},B = {b2*q2i | 0 <= i <= n2-1},问将A ...

  2. 总结&计划

    最近完成的事儿: 1. 看完了<c专家编程>并且整理了读书笔记 2. 看了半章<大数据>发现这本书里面是纯纯的干货...习题需要认真做,算法需要仔细体会...不适合突击,尤其是 ...

  3. F - Wormholes

    题目大意: 农民约翰在农场散步的时候发现农场有大量的虫洞,这些虫洞是非常特别的因为它们都是单向通道,为了方便现在把约翰的农田划分成N快区域,M条道路,W的虫洞. 约翰是时空旅行的粉丝,他希望这样做,在 ...

  4. ARES

    ARES规划是恒生公用技术平台规划,以敏捷Agility.重用性Reused.扩展性Extend.简单性Simple为核心特性与价值取向,规划涉及ARES Server运行支撑平台.ARES Stud ...

  5. Java学习的随笔(3)接口

    首先是一段<Java编程思想>中,对接口的解释:“interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现.它允许创建者确定方法名.参数列表.返回类型,但是没有任何 ...

  6. java+ mysql 给所有的表添加假数据

    需求:别的项目, 代码扣过来了, 数据库也拿过来了, 但是数据库全是空表, 一共700 张表,需求是给表添加假数据,让它能运行起来. 一下是代码实现: 1.数据库连接: public static C ...

  7. VS2012 无法启动IIS Express Web服务器的解决方案

    本文转载:http://blog.csdn.net/hongleidy5000/article/details/22732621 打开VS2012解决方案资源管理器 -> 点选 Web 项目选择 ...

  8. SAP-MM:收货转储时提示 M7053“只能在公司代码 **** 的期间 2014/04 和 2014/03 中记账”

    错误信息   消息号M7053   解决方法 Step 1.使用MMPV进入"关闭账期"界面. Step 2.输入"公司代码"."期间".& ...

  9. Android之开发常用颜色

    Android开发中常常要用一些个性化的颜色,然而茫茫的RBG颜色对照表,往往给人眼花缭乱的感觉,更别说从中轻易选出一两种比较满意的颜色,下面我就总结一下开发中常用到的比较绚丽的颜色,都是有名有姓的哦 ...

  10. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三

    /** ****************************************************************************** * @author    暴走的小 ...