BZOJ2200

听说加上slf优化的spfa的卡过,真的不想写这些东西。

考虑使用堆优化的dij算法。

先加上所有双向边,然后dfs一下搜出所有由双向边构成的联通块,然后加上所有的单向边,一边对所有联通块拓扑排序一边在联通块内部处理最短路,因为所有的双向边都是不带负权的,而单向边都是有负权的,所以这样规避dij贪心的错误之处。

注意到一个$inf$可能被另一个$inf$加上一个负权边拓展得到,所以最后的答案可能会小于$inf$,检验的时候注意取的极大值要小于一开始赋的$inf$。

时间复杂度$O(nlogn)$。

Code:

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <vector>
using namespace std;
typedef pair <int, int> pin;const int N = 25005;
const int M = 2e5 + 5;
const int inf = 1e8;int n, m1, m2, st, tot = 0, head[N], dis[N];
int l = 1, r = 0, q[N], deg[N], sccCnt = 0, bel[N];
bool vis[N];
vector <int> scc[N];struct Edge {int to, nxt, val;
} e[M];inline void add(int from, int to, int val) {e[++tot].to = to;e[tot].val = val;e[tot].nxt = head[from];head[from] = tot;
}template <typename T>
inline void read(T &X) {X = 0; char ch = 0; T op = 1;for(; ch > '9'|| ch < '0'; ch = getchar())if(ch == '-') op = -1;for(; ch >= '0' && ch <= '9'; ch = getchar())X = (X << 3) + (X << 1) + ch - 48;X *= op;
}void dfs(int x) {bel[x] = sccCnt, scc[sccCnt].push_back(x);for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if(!bel[y]) dfs(y);}
}priority_queue <pin> Q;
void dij(int c) {for(unsigned int i = 0; i < scc[c].size(); i++) Q.push(pin(-dis[scc[c][i]], scc[c][i]));for(; !Q.empty(); ) {int x = Q.top().second; Q.pop();if(vis[x]) continue;vis[x] = 1;for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if(bel[y] == c) {if(dis[y] > dis[x] + e[i].val) {dis[y] = dis[x] + e[i].val;Q.push(pin(-dis[y], y));}} else {if(dis[y] > dis[x] + e[i].val) dis[y] = dis[x] + e[i].val;deg[bel[y]]--;if(!deg[bel[y]]) q[++r] = bel[y];    }}}
}int main() {read(n), read(m1), read(m2), read(st);for(int x, y, v, i = 1; i <= m1; i++) {read(x), read(y), read(v);add(x, y, v), add(y, x, v);}for(int i = 1; i <= n; i++)if(!bel[i]) ++sccCnt, dfs(i);for(int x, y, v, i = 1; i <= m2; i++) {read(x), read(y), read(v);add(x, y, v);deg[bel[y]]++;}for(int i = 1; i <= sccCnt; i++)if(!deg[i]) q[++r] = i;memset(dis, 0x3f, sizeof(dis)); dis[st] = 0;for(; l <= r; ++l) dij(q[l]);for(int i = 1; i <= n; i++) {if(dis[i] > inf) puts("NO PATH");else printf("%d\n", dis[i]);}return 0;
}

View Code

转载于:https://www.cnblogs.com/CzxingcHen/p/9562972.html

Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes相关推荐

  1. USACO07DEC道路建设Building Roads(prim算法+堆优化与Kruskal+路径压缩对比)

    目录 primprimprim算法 KruskalKruskalKruskal算法 P2872 [USACO07DEC]道路建设Building Roads 4 1 1 1 3 1 2 3 4 3 1 ...

  2. 洛谷——P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

  3. Luogu 2296 寻找道路

    https://www.luogu.org/problemnew/show/2296 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以 ...

  4. 【luogu P4320】道路相遇(圆方树)

    道路相遇 题目链接:luogu P4320 题目大意 给你一个无向连通图,无重边自环,然后每次给你两点,问你有多少个点是两点间路径必有的. 思路 圆方树pre模板题? 圆方树怎么做这里不说,看铁人两项 ...

  5. LUOGU P2296 寻找道路 (noip 2014)

    传送门 解题思路 首先建一张反图,从终点dfs出哪个点直接或间接相连,然后直接跑最短路,跑的时候判断一下所连的点是否与终点相连. 代码 #include<iostream> #includ ...

  6. 为自动驾驶技术服务的基础道路设施

    导 语 服务于人和机器的共生道路在推动自动驾驶技术发展.减少交通事故等方面有着至关重要的作用.那么,什么是共生道路?共生道路为什么会起到如此关键的作用?共生道路的发展趋势是怎样的?请看公安部道路交通安 ...

  7. [总结]2019年9月 OI学习/刷题记录

    从现在开始记录一下每天的学习情况.主力LOJ? 2019/9/5 LibreOJ #2543. 「JXOI2018」排序问题 答案显然是\(\frac{(n+m)!}{Cnt_1!Cnt_2!\cdo ...

  8. CB Insights发布2017全球AI企业100强,出门问问、碳云智能入选

    来源:亿欧 概要:在美国加州圣芭芭拉举办的创新峰会(TheInnovation Summit)上,CB Insight的CEO Anand Sanwal揭晓了全球2017 AI100名单,评选出全球最 ...

  9. 新概念英语第二册61-96课(转)

    Lesson 61  Trouble with the Hubble哈勃望远镜的麻烦   1.哈勃望远镜The Hubble telescope被发射到太空was launched into spac ...

最新文章

  1. LeetCode刷题记录9——58. Length of Last Word(easy)
  2. 【计算理论】计算复杂性 ( 阶段总结 | 计算理论内容概览 | 计算问题的有效性 | 语言与算法模型 | 可计算性与可判定性 | 可判定性与有效性 | 语言分类 ) ★
  3. mysql 密码忘记了怎么办? [仅msyql8版本]
  4. 在python的dataframe中进行类似于mysql的join操作(持续更新)
  5. 【ArcGIS风暴】ArcGIS求一个矢量图层中多个图斑的“四至点”坐标案例教程
  6. 标签页 html实现,htmlcssjs实现tab标签页示例代码.pdf
  7. 发展数字经济面临哪些困难_解决数字音乐制作面临的最大问题之一
  8. 内部代码显示苹果iOS 15.5 Beta新增支持外部链接支付
  9. 小米12 Ultra外观设计曝光:白色陶瓷机身 后置硕大相机模组
  10. Flex的TabNavigator中tab触发的事件
  11. 设计模式—原型模式及其扩展(思维导图)
  12. (转)Android调试运行时错误之Process XXX terminated by signal (11)
  13. Ribbon客户端负载均衡算法分析
  14. Linux下安装Win10ARM,更多安卓旗舰机将可以安装运行Win10 ARM
  15. 域名微信拦截html代码,微信域名拦截查询网页源码——一个非常实用的微信域名检测工具实现...
  16. 权重的计算(变异系数法)
  17. ubuntu中谷歌拼音输入法的简化字和繁体字的切换
  18. application octet stream java_Java servlet句柄application/octet-stream用于图像上传
  19. Android实现横竖屏切换,以及手机横竖屏旋转的时候,实现横竖屏切换
  20. 如何修改PDF中图片的大小尺寸

热门文章

  1. POJ1269:Intersecting Lines(判断两条直线的关系)
  2. Checked ==true ? Y:N ;
  3. 关于网站域名的配置过程
  4. 转 OFBiz 菜单组件(menu-widget)指引
  5. What do you need at home?
  6. 视频直播技术详解(7)现代播放器原理
  7. Tomcat服务在Eclipse中能够正常启动,但页面出现404错误的解决方法
  8. Oracle Hint 之 Parallel
  9. AspNetPager 样式以及使用(漂亮)
  10. Integrating Spring and EHCache