P3008 [USACO11JAN]道路和飞机Roads and Planes
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的更多相关文章
- Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes
BZOJ2200 听说加上slf优化的spfa的卡过,真的不想写这些东西. 考虑使用堆优化的dij算法. 先加上所有双向边,然后dfs一下搜出所有由双向边构成的联通块,然后加上所有的单向边,一边对所有 ...
- bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads
P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...
- 洛谷——P2872 [USACO07DEC]道路建设Building Roads
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- P3008 [USACO11JAN]Roads and Planes G 拓扑排序+Dij
题目描述 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 & ...
- P3008 [USACO11JAN]Roads and Planes G (最短路+拓扑排序)
该最短路可不同于平时简单的最短路模板. 这道题一看就知道用SPFA,但是众所周知,USACO要卡spfa,所以要用更快的算法. 单向边不构成环,双向边都是非负的,所以可以将图分成若干个连通块(内部只有 ...
- [USACO11JAN]Roads and Planes G【缩点+Dij+拓补排序】
题目 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 < ...
- 【图论】USACO11JAN Roads and Planes G
题目内容 洛谷链接 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到\(T\)个城镇 (\(1 <= T <= 25,000\)),编号为\(1\)到\ ...
- [USACO11JAN]Roads and Planes
嘟嘟嘟 这道题他会卡spfa,不过据说加SLF优化后能过,但还是讲讲正解吧. 题中有很关键的一句,就是无向边都是正的,只有单向边可能会有负的.当把整个图缩点后,有向边只会连接在每一个联通块之间(因为图 ...
随机推荐
- 原生JS实现全选,反选
无样式,比较丑 <!DOCTYPE html><html><head><meta charset="UTF-8"><title ...
- Linux中脚本
编辑脚本要注意开头 和 修改脚本的权限 1. 开头 #!/bin/bash 如查看/etc路径下的文件,可以编辑 2. 修改权限 chmod 775 脚本文件.sh 如创建一个脚本(test.sh ...
- Pandas的index属性
我们在统计数据的长度或者个数,不用统计去专门获取数值,而是用index这个数据获取即可,DataFrame的index直接就是最前面的索引号,如果要统计列的个数,使用DataFrame.colums获 ...
- HTML_body标签
常用符号:空格:  大于号:> 小于号: < 块级标签:H标签(加大加粗),P标签(段落间有间距),DIV(白板) 行内标签:SPAN标签(白板) <!- ...
- SUSE12的虚拟机安装以及ORACLE12C的安装
在本文中用到的所有参数,均位于文后附录中 在VMware中新建虚拟机,建好之后挂载光盘,启动虚拟机进入安装界面 初始化中 选择跳过注册 选择DVD模式 选择接受许可证条款 默认选择 选择默认系统 选择 ...
- dedecms利用addfields body在首页调用文章内容
开源程序比较好的一点是可以进行二次开发,比如ytkah想要开发一个专家出诊表的功能模块,如下图所示,每天的专家都不一样,可以用到内容模型,但是相对比较复杂:我们可以把每天的坐诊情况写成一篇文章再通过调 ...
- Integer.valueOf方法的源码解读
public class IntegerDemo { public static void main(String[] args) { Integer i01 = ; ; Integer i03 = ...
- [py][mx]django注册-邮件激活
人生,学习,就是一段旅途, 说是放弃,其实是自信心作祟. 因为不同时间段状态,譬如晚上和早上刚来状态不一样.做相同事情容器失去自信而放弃. 坚持可以打破这个魔咒 还有就是有些问题得分割, 不要让压死牛 ...
- POJ:Dungeon Master(三维bfs模板题)
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16748 Accepted: 6522 D ...
- JSP页面中引入另一个JSP页面
一个JSP页面中引入另一个JSP页面,相当于把另一个JSP页面的内容复制到对应位置: <%@include file="date.jsp" %> 一般页面的top和bo ...