P3008 [USACO11JAN]道路和飞机Roads and Planes

Dijkstra+Tarjan

因为题目有特殊限制所以不用担心负权的问题

但是朴素的Dijkstra就算用堆优化,也显然会超时。

这是因为Dj每次扩展时,总是找到费用最小那个点进行扩展。

而本题的毒瘤数据可以在一个图(设其点数为k)后连一长串负权边。这样每次扩展的最坏复杂度O(n^k),T出天际。

但是我们又可以用到题目的特殊限制:一个图被限制成若干层,每层的最短路互相无影响

显然,我们可以用Tarjan缩点法,把图分层,把每层分离出来,单独跑一遍Dj。

然后就没了。(逃

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cctype>
using namespace std;
template <typename T> inline T min(T &a,T &b) {return a<b ?a:b;}
template <typename T> inline void read(T &x){
char c=getchar(); x=; bool f=;
while(!isdigit(c)) f= !f||c=='-' ? :,c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
x= f? x:-x;
}
int n,m1,m2,s,d[],cnt1,hd[],nxt[],ed[],poi[],val[];
int dfs_clock,cnt2,_top,low[],dfn[],be[],st[]; //用于Tarjan
struct data{
int d,u;
bool operator < (const data &tmp) const {
if(be[u]!=be[tmp.u]) return be[u]<be[tmp.u]; //同块内先处理
return d>tmp.d;
}
}; priority_queue <data> h;
inline void add(int x,int y,int v){
nxt[ed[x]]=++cnt1; hd[x]= hd[x] ? hd[x]:cnt1;
ed[x]=cnt1; poi[cnt1]=y; val[cnt1]=v;
}
inline void tarjan(int x){ //Tarjan模板,可右转P3387
dfn[x]=low[x]=++dfs_clock; st[++_top]=x;
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(!dfn[to]) tarjan(to),low[x]=min(low[x],low[to]);
else if(!be[to]) low[x]=min(low[x],dfn[to]);
}
if(low[x]==dfn[x]){ //给出每个点所处层的编号
be[x]=++cnt2;
while(st[_top]!=x) be[st[_top--]]=cnt2;
--_top;
}
}
void dijkstra(){ //裸的
memset(d,,sizeof(d));
h.push((data){d[s]=,s});
while(!h.empty()){
data x=h.top(); h.pop();
if(x.d!=d[x.u]) continue;
for(int i=hd[x.u];i;i=nxt[i])
if(x.d+val[i]<d[poi[i]]){
d[poi[i]]=x.d+val[i];
h.push((data){d[poi[i]],poi[i]});
}
}
}
int main(){
read(n); read(m1); read(m2); read(s); int q1,q2,q3;
for(int i=;i<=m1;++i) read(q1),read(q2),read(q3),add(q1,q2,q3),add(q2,q1,q3);
for(int i=;i<=m2;++i) read(q1),read(q2),read(q3),add(q1,q2,q3);
tarjan(s); //tarjan缩点
for(int i=;i<=n;++i) if(!dfn[i]) tarjan(i);
dijkstra();
for(int i=;i<=n;++i){
if(d[i]==d[]) printf("NO PATH\n");
else printf("%d\n",d[i]);
}return ;
}

P3008 [USACO11JAN]道路和飞机Roads and Planes的更多相关文章

  1. Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes

    BZOJ2200 听说加上slf优化的spfa的卡过,真的不想写这些东西. 考虑使用堆优化的dij算法. 先加上所有双向边,然后dfs一下搜出所有由双向边构成的联通块,然后加上所有的单向边,一边对所有 ...

  2. bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...

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

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

  4. 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解

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

  5. P3008 [USACO11JAN]Roads and Planes G 拓扑排序+Dij

    题目描述 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 & ...

  6. P3008 [USACO11JAN]Roads and Planes G (最短路+拓扑排序)

    该最短路可不同于平时简单的最短路模板. 这道题一看就知道用SPFA,但是众所周知,USACO要卡spfa,所以要用更快的算法. 单向边不构成环,双向边都是非负的,所以可以将图分成若干个连通块(内部只有 ...

  7. [USACO11JAN]Roads and Planes G【缩点+Dij+拓补排序】

    题目 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 < ...

  8. 【图论】USACO11JAN Roads and Planes G

    题目内容 洛谷链接 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到\(T\)个城镇 (\(1 <= T <= 25,000\)),编号为\(1\)到\ ...

  9. [USACO11JAN]Roads and Planes

    嘟嘟嘟 这道题他会卡spfa,不过据说加SLF优化后能过,但还是讲讲正解吧. 题中有很关键的一句,就是无向边都是正的,只有单向边可能会有负的.当把整个图缩点后,有向边只会连接在每一个联通块之间(因为图 ...

随机推荐

  1. Asp.net中的web.config配置

    目录 Asp.net中的web.config配置... 1 一. 配置文件保存位置... 2 二. 配置文件加载顺序... 2 三. 配置文件节点介绍... 3 1. . 3 2. . 5 3. . ...

  2. Ubuntu16.04下编译安装及运行单目ORBSLAM2

    官网有源代码和配置教程,地址是 https://github.com/raulmur/ORB_SLAM2 1 安装必要工具 首先,有两个工具是需要提前安装的.即cmake和Git. sudo apt- ...

  3. Python requests 301/302/303重定向(跨域/本域)cookie、Location问题

    今天使用request的get方法获取一个网站的登录页信息,结果使用charles抓包的时候发现该网站登录页303(重定向的问题),网上查了很多资料,原因如下: 一.cookie 原因:利用reque ...

  4. 优云软件助阵ArchSummit全球架构师峰会

    由极客邦科技与 InfoQ 中国主办的 ArchSummit 全球架构师峰会深圳站,于 7 月 7 日 - 8 日在深圳华侨城洲际酒店举办. 本次大会特邀 100 多位国内外技术专家,与1000余名技 ...

  5. sql优化实例(用左连接)

    改为 也就是说用左连接代替where条件,这样的话效率会提高很多.

  6. CentOS7.1.x+Druid 0.12 集群配置

    原文转载自:https://blog.csdn.net/bigtree_3721/article/details/79583008 先决条件:安装版本列表 本次安装满足下面的条件: CentOS v7 ...

  7. 十天精通CSS3(12)

    自由缩放属性resize 为了增强用户体验,CSS3增加了很多新的属性,其中resize就是一个重要的属性,它允许用户通过拖动的方式来修改元素的尺寸来改变元素的大小.到目前为止,可以使用overflo ...

  8. word自动导入目录

    1:如果在编写word时,有给各章添加标题,可以使用word的目录生成功能,如图:

  9. java的redis工具类

    package com.mracale.sell.utils; /** * @Auther: Mracale */ import org.springframework.beans.factory.a ...

  10. http形式的webservice

    import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import ...