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. WCF的简单使用

    WCF简单介绍 WCF(windows communication foundation)是微软推出的数据通信的统一编程模型,在WCF有四个主要的关键点: abcd Address(地址):定义服务的 ...

  2. ubuntu16.04下安装kdevelop和汉化

    1.Kdevelop安装 最简单的命令行安装,打开终端,执行 sudo apt-get install kdevelop 2.Kdevelop汉化 不需要自己下载汉化包,Kdevelop安装后,在终端 ...

  3. SQL Fundamentals: 数据更新及事务处理(INSERT INTO,UPDATE,DELETE,事务,锁)

    SQL Fundamentals || Oracle SQL语言 在SQL语句中,数据操作语言DML由两部分组成,查询(DQL).更新操作(增加,修改,删除). 增加数据(INSERT INTO) 数 ...

  4. 2018No-java面试知识

    1.框架 1. springboot比spring的优点? 2. Springmvc的基本流程? 3. 微服务之间调用不会慢吗? 4. 大图片和大数据库怎么存储? 5. spring事物?四大特征, ...

  5. 2018/03/10 每日一个Linux命令 之 cksum

    每日一个Linux命令 2018-03-10 Linux 命令 cksum cksum [文件]  今天楼下的一个大妈去世了,不仅感叹,现如今,真的和以前不一样了,楼上楼下都不知道住的是谁? cksu ...

  6. 【pyqt5】QdateTimeEdit(日期时间)

    返回当前日期和时间设置 from PyQt5 import QtCore, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): ...

  7. mysql清空有外键关联的表

    第一种:(不要外键约束) 手动删除外键约束: 删除表数据 第二种:(保留外键约束) SET FOREIGN_KEY_CHECKS = 0;   TRUNCATE TABLE 表名;  SET FORE ...

  8. 1分钟了解协同过滤,pm都懂了

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/79565720 projec ...

  9. HTTP头部信息解释分析(详细整理)

    这篇文章为大家介绍了HTTP头部信息,中英文对比分析,还是比较全面的,若大家在使用过程中遇到不了解的,可以适当参考下 HTTP 头部解释 1. Accept:告诉WEB服务器自己接受什么介质类型,*/ ...

  10. Spark Storage(二) 集群下的broadcast

    Broadcast 简单来说就是将数据从一个节点复制到其他各个节点,常见用于数据复制到节点本地用于计算,在前面一章中讨论过Storage模块中BlockManager,Block既可以保存在内存中,也 ...