该最短路可不同于平时简单的最短路模板。

这道题一看就知道用SPFA,但是众所周知,USACO要卡spfa,所以要用更快的算法。

单向边不构成环,双向边都是非负的,所以可以将图分成若干个连通块(内部只有双向边),用拓扑排序的框架处理整张图求解最短路,对于每个入度为0的连通块求一次最短路,因为边权非负,可以用dijkstra。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=25005,M=150005;
4 int head[N],to[M],nxt[M],edge[M],mark[M],tot;
5 int n,m,p,s,c[N],cnt,deg[N],d[N];
6 bool v[N];
7 queue<int> q;
8 vector<int> a[N];
9 priority_queue<pair<int,int> > heap;
10
11 void add(int x,int y,int z,int k){
12 nxt[++tot]=head[x];head[x]=tot;to[tot]=y;
13 mark[tot]=k;edge[tot]=z;
14 }
15
16 void dfs(int x){
17 c[x]=cnt;
18 a[cnt].push_back(x);
19 for(int i=head[x];i;i=nxt[i]){
20 if(mark[i]==1) continue;//单向边就跳过
21 int y=to[i];
22 if(!c[y]) dfs(y);
23 }
24 }
25
26 void dijkstra(int k){//算k这一块的最短路
27 for(int j=0;j<a[k].size();j++){//将块中每个点取出
28 int x=a[k][j];
29 heap.push(make_pair(-d[x],x));
30 }
31 while(!heap.empty()){
32 int x=heap.top().second;heap.pop();
33 if(v[x]) continue;
34 v[x]=1;
35 for(int i=head[x];i;i=nxt[i]){
36 int y=to[i];
37 if(mark[i]==0){
38 if(d[y]>d[x]+edge[i]){
39 d[y]=d[x]+edge[i];
40 heap.push(make_pair(-d[y],y));
41 }
42 }else{
43 d[y]=min(d[y],d[x]+edge[i]);
44 if(--deg[c[y]]==0) q.push(c[y]);//入度为0加入队列
45 }
46 }
47 }
48 }
49
50 int main(){
51 scanf("%d%d%d%d",&n,&m,&p,&s);
52 for(int i=1;i<=m;i++){
53 int x,y,z;
54 scanf("%d%d%d",&x,&y,&z);
55 add(x,y,z,0);
56 add(y,x,z,0);//双向边
57 }
58 for(int i=1;i<=p;i++){
59 int x,y,z;
60 scanf("%d%d%d",&x,&y,&z);
61 add(x,y,z,1);
62 }
63 for(int i=1;i<=n;i++){
64 if(c[i]==0){
65 cnt++;
66 dfs(i);
67 }
68 }
69 for(int x=1;x<=n;x++){//统计每个连通块总入度
70 for(int i=head[x];i;i=nxt[i]){
71 if(mark[i]==0) continue;
72 deg[c[to[i]]]++;
73 }
74 }
75 for(int i=1;i<=cnt;i++)//拓扑排序
76 if(!deg[i]) q.push(i);
77 memset(d,0x3f,sizeof(d));
78 d[s]=0;
79 while(!q.empty()){
80 int k=q.front();q.pop();//块号
81 dijkstra(k);
82 }
83 for(int i=1;i<=n;i++){
84 if(d[i]>n*10000) puts("NO PATH");
85 else printf("%d\n",d[i]);
86 }
87 }

P3008 [USACO11JAN]Roads and Planes G (最短路+拓扑排序)的更多相关文章

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

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

  2. 【图论】USACO11JAN Roads and Planes G

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

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

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

  4. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  5. [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...

  6. [USACO11JAN]Roads and Planes

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

  7. 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP

    [BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...

  8. BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  9. NOIP2017 Day1 T3 逛公园(最短路+拓扑排序+DP)

    神tm比赛时多清个零就有60了T T 首先跑出1起点和n起点的最短路,因为k只有50,所以可以DP.设f[i][j]表示比最短路多走i的长度,到j的方案数. 我们发现如果在最短路上的和零边会有后向性, ...

随机推荐

  1. NoSQL,关系型数据库,行列数据库对比、类比

    数据库对比.类比 关系型数据库.NoSQL 关系型数据库 表与表之间有关系.表存储一些格式化的数据结构,每个元组字段的组成都一样,这样便于表之间的联结操作.不过也限制了其性能瓶颈. 更支持SQL,支持 ...

  2. 题解【洛谷 P1246 编码】

    题目 编码工作常被运用于密文或压缩传输.这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数宇. 字母表中共有 \(26\) 个字母 \(\{\tt a,b,\cdots,z\}\),这些 ...

  3. 自定义bean对象实现序列化接口

    上一个word count的案例中,我们为了理解mapreduce的流程,写了上面的代码.现在我们要把一个实体类序列化.比如现在有这么一个文件,里面的数据格式是这样的: 第一列是时间戳,第二列是手机号 ...

  4. YII地址切换

    以/开头表示跳出当前控制器 例如 return $this->render('/code/login'// 跳出当前控制器,进入Code下login视图 ,['model' => $mod ...

  5. C#/VB.NET 将PDF转为PDF/X-1a:2001

    PDF/X-1a是一种PDF文件规范标准,在制作.使用PDF以及印刷时所需要遵循的技术条件,属于PDF/X-1标准下的一个子标准. PDF/X-1标准有由CGATS于1999年制定的PDF/X-1:1 ...

  6. Python基础之dict和set的使用

    dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言种也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字 ...

  7. Android 自定义View - 柱状波形图 wave view

    前言 柱状波形图是一种常见的图形.一个个柱子按顺序排列,构成一个波形图. 柱子的高度由输入数据决定.如果输入的是音频的音量,则可得到一个声波图. 在一些音频软件中,我们也可以左右拖动声波,来改变音频的 ...

  8. SpringMvc 如何同时支持 Jsp 和 Json 接口?

    后端同学基本都会见过这种场景:在同一个工程中,有些页面使用jsp模版渲染,同时还有其他接口提供Json格式的返回值.为了同时支持这两种场景,我们一般是如何处理的呢? 其实非常简单: 1.在项目中为 S ...

  9. MySQL设置字段从指定数字自增,比如10000

    MySQL设置字段从指定数字自增,比如10000. 方式一 方式二 方式一 此时就解决了MySQL从指定数字进行自增 CREATE TABLE hyxxb( hyid INT AUTO_INCREME ...

  10. 网安等保-Linux服务器之最新Ubuntu-22.04-LTS系统内核优化与安全加固配置脚本使用分享

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x00 前言 ...