题目链接:

http://codeforces.com/contest/567/problem/E

题意:

给你一个带重边的图,求三类边:

在最短路构成的DAG图中,哪些边是必须经过的;

其他的(包括不在DAG上的边)不是必须经过的边把权值改小多少才能通过,

或者根本不可能通过的。

题解:

从起点s跑一遍最短路得到d[maxn],从终点t跑一遍最短路得到d2[maxn],对于边(u,v,w),如果d[u]+d2[v]+w==d[t]那么这条边在最短路上,对于不在最短路上的边,如果d[u]+d2[v]+w-d[t]+1<w则可以重建,否则输出NO。

对于所有最短路构成的DAG(建成无向图)跑一遍tarjan求割边,所有的割边输出YES。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std; typedef __int64 LL;
#define INF (1LL<<61) struct Edge {
int u, v, type,bri,id;
LL w;
Edge(int u, int v, LL w,int id) :u(u), v(v), w(w), type(),bri(),id(id) {}
}; void addEdge(vector<int> G[],vector<Edge> &egs,int u, int v, int w,int id=) {
egs.push_back(Edge(u, v, w,id));
G[u].push_back(egs.size() - );
} const int maxn = 2e5 + ;
const int maxm = maxn * ;
int n, m, s, t; vector<int> G[maxn],G2[maxn];
vector<Edge> egs,egs2; struct Heap {
int v; LL d;
Heap(int v, LL d) :v(v), d(d) {}
bool operator < (Heap tmp) const {
return d > tmp.d;
}
}; LL d[maxn], d2[maxn];
int done[maxn];
void dijkstral(vector<int> G[], vector<Edge> &egs,LL *d, int s) {
for (int i = ; i < maxn; i++) d[i] = INF;
memset(done, , sizeof(done));
priority_queue<Heap> pq;
d[s] = , pq.push(Heap(s,));
while (!pq.empty()) {
int u = pq.top().v; pq.pop();
if (done[u]) continue;
done[u] = ;
for (int i = ; i < G[u].size(); i++) {
Edge& e = egs[G[u][i]];
if (d[e.v] > d[u] + e.w) {
d[e.v] = d[u] + e.w;
pq.push(Heap(e.v, d[e.v]));
}
}
}
} vector<int> DAG[maxn];
vector<Edge> egs3; int pre[maxn], low[maxn], dfs_clock;
int dfs(vector<int> G[],vector<Edge> &egs,int u) {
int lowu = pre[u] = ++dfs_clock;
int child = ;
for (int i = ; i < G[u].size(); i++) {
Edge &e = egs[G[u][i]];
if (e.type == ) continue;
egs[G[u][i] ^ ].type = ;
if (!pre[e.v]) {
child++;
int lowv = dfs(G, egs, e.v);
lowu = min(lowu, lowv);
if (lowv > pre[u]) {
e.bri = ;
}
}
else if (pre[e.v] < pre[u]) {
lowu = min(lowu, pre[e.v]);
}
}
low[u] = lowu;
return lowu;
} int main() {
scanf("%d%d%d%d", &n, &m, &s, &t),s--,t--;
for (int i = ; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w),u--,v--;
addEdge(G,egs,u, v, w);
addEdge(G2, egs2, v, u, w);
}
dijkstral(G,egs,d,s);
dijkstral(G2, egs2,d2, t); for (int i = ; i < egs.size(); i++) {
Edge& e = egs[i];
if (e.w+d[e.u]+d2[e.v]==d[t]) {
addEdge(DAG, egs3, e.u, e.v, e.w,i);
addEdge(DAG, egs3, e.v, e.u, e.w,i);
}
} memset(pre, , sizeof(pre));
dfs_clock = ;
dfs(DAG, egs3, s);
for (int i = ; i < egs3.size(); i++) {
Edge& e = egs3[i];
if (e.bri) {
egs[e.id].bri = ;
}
}
for (int i = ; i < egs.size(); i++) {
Edge& e = egs[i];
if (e.bri) printf("YES\n");
else {
LL delta = d[e.u] + d2[e.v] + e.w - d[t] + ;
if (delta<e.w) printf("CAN %I64d\n", delta);
else printf("NO\n");
}
}
return ;
}

总结:

这题跳了两个坑:

1、距离和会爆int:

发现问题之后改了d[maxn],但是一直没发现Heap结构体里面的d没有改!!!!wa了七八次!

2、卡spfa的时间!!!

。。

代码调试出错误的时候,改正一定要彻底!不要有的地方改了有的地方漏了!比如dijkstra,改了d还要改Heap结构体!!!

Codeforces Round #Pi (Div. 2) E. 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 Round #Pi (Div. 2) 567E President and Roads ( dfs and similar, graphs, hashing, shortest paths )

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

  3. map Codeforces Round #Pi (Div. 2) C. Geometric Progression

    题目传送门 /* 题意:问选出3个数成等比数列有多少种选法 map:c1记录是第二个数或第三个数的选法,c2表示所有数字出现的次数.别人的代码很短,思维巧妙 */ /***************** ...

  4. 构造 Codeforces Round #Pi (Div. 2) B. Berland National Library

    题目传送门 /* 题意:给出一系列读者出行的记录,+表示一个读者进入,-表示一个读者离开,可能之前已经有读者在图书馆 构造:now记录当前图书馆人数,sz记录最小的容量,in数组标记进去的读者,分情况 ...

  5. Codeforces Round #Pi (Div. 2) ABCDEF已更新

    A. Lineland Mail time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...

  6. Codeforces Round #Pi (Div. 2) D. One-Dimensional Battle Ships set乱搞

    D. One-Dimensional Battle ShipsTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...

  7. Codeforces Round #Pi (Div. 2) C. Geometric Progression map

    C. Geometric Progression Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

  8. Codeforces Round #Pi (Div. 2) B. Berland National Library set

    B. Berland National LibraryTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  9. Codeforces Round #Pi (Div. 2) A. Lineland Mail 水

    A. Lineland MailTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/567/proble ...

随机推荐

  1. (js有关图片加载问题)dom加载完和onload事件

    引用旺旺的话...哈哈哈DOMContentLoaded事件表示页面的DOM结构绘制完成了,这时候外部资源(带src属性的)还没有加载完.而onload事件是等外部资源都加载完了就触发的.$.read ...

  2. js如何检测打开窗口是否存在的三个方法?

    js打开窗口一般也就是使用window.open方法: win = window.open(CHILD_WINDOW_URL, CHILD_WINDOW_NAME, CHILD_WINDOW_ATTR ...

  3. 7 款令人赞叹的 HTML5 动画应用

    1.HTML5 3D图片阴影翻转动画 这是一款很酷的HTML5 3D动画特效,这款3D特效可以为你的图片增加阴影的效果,而且可以让图片在鼠标滑过的时候出现3D翻转的动画效果. 在线演示 源码下载 2. ...

  4. codevs 3185 队列练习1

    题目描述 Description 给定一个队列(初始为空),只有两种操作入队和出队,现给出这些操作请输出最终的队头元素. 操作解释:1表示入队,2表示出队 输入描述 Input Description ...

  5. TCP通信三次握手的过程

    过程 编辑 第一次 第一次握手:建立连接时,客户端 发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认:SYN:同步序列编号(Synchronize Sequence Nu ...

  6. windowsphone 瀑布流&ui虚拟化

    瀑布流已经有点年代了吧,不过wp上还真是挺少资料的.今天抽空把自己之前搞过的东西写出来,避免大家重复劳动. 一.简单的瀑布流排版加入ui虚拟化. 最近看了 段博琼  ui虚拟化的一篇博文,链接:htt ...

  7. <Linux下FTP服务的搭建>

    默认安装好ftp软件包匿名用户是可以下载的.匿名以后可以上传:anon_upload_enable=YES# getsebool -a | grep ftpallow_ftpd_anon_write ...

  8. ADO.NET笔记——执行事务

    相关知识: 处于同一事务(Transaction)内的一组操作,要么都成功执行,最后完全提交:但如果只要有任何一个操作失败或者出问题,所有值钱执行的操作也都取消并恢复到初始状态(即回滚) SqlTra ...

  9. yaf运行错误:Class 'Yaf_Application' not found

    提示:致命错误 Yaf_Application 基类没有加载进去 一检查:phpinfo() 里yaf 扩展有没有安装上 扩展也安装进去了 这时在分布式配置文件的重写 也是正确 这时百思不得其解,没办 ...

  10. nss_12 上传文件后返回jsonresult结果,IE中出现文件下载框

    因为控制器返回的是JsonResult, 但是在IE8中一直返回文件下载的对话框. 转到谷歌浏览器倒没有问题. 网上找的方法, 要么是跟到一个新的成功页面, 要么是直接返回html, 觉得应该有更好的 ...