题目链接

分析:题目要求一个连通图的从1到n的严格次短路,我们只需要在跑最短路的时候顺便判一下次短路是否能够被更新即可。

dis[x][0]表示1到x的最短路,而dis[x][1]则表示次短路,需要分成三类讨论:

dis[x][0]+e[i].w<dis[to][0],此时dis[x][1]是原最短路和dis[x][1]+e[i].w的较小值(注意这里最短路要在更新完次短路后再更新);

dis[x][0]+e[i].w>dis[to][0]&&dis[x][0]+e[i].w<dis[to][1],这条路虽然不能更新最短路,但可以更新次短路;

dis[x][0]+e[i].w==dis[to][0],因为是严格小于,所以不能把这个值赋给次短路,应为dis[to][1]=min(dis[to][1],dis[x][1]+w[i].w)。

另外,若这条边可以更新最短路或是次短路并且to不在队列中,再将to加入队列中。

最最后,记得每次一个点出队后要记得把标记清为0!!!

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 const int N=5005,inf=0x3f3f3f3f;
 6 int n,m,tot=0,first[N],q[N];
 7 struct node{
 8     int ne,to,w;
 9 }e[100000*2];
10 int read(){
11     int ans=0,f=1;char c=getchar();
12     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
13     while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
14     return ans*f;
15 }
16 int dis[N][2];
17 bool ok[N];
18 void add(int u,int v,int z){
19     tot++;e[tot].ne=first[u];first[u]=tot;e[tot].to=v;e[tot].w=z;
20     tot++;e[tot].ne=first[v];first[v]=tot;e[tot].to=u;e[tot].w=z;
21 }
22 int mins(int x,int y){return x>y?y:x;}
23 void spfa(){
24     for(int i=1;i<=n;i++)dis[i][1]=dis[i][0]=inf;
25     dis[1][0]=0;
26     int h=0,t=1;q[0]=1;ok[1]=1;
27     while(h!=t){
28         int x=q[h++];if(h>=5000)h=0;
29         for(int i=first[x];i;i=e[i].ne){
30             int to=e[i].to;bool ff=0;
31             int p1=dis[x][0]+e[i].w;
32             if(dis[to][0]>p1){
33                 ff=1;dis[to][1]=mins(dis[to][0],dis[x][1]+e[i].w);
34                 dis[to][0]=p1;
35             }
36             else if(p1>dis[to][0]&&dis[to][1]>p1)ff=1,dis[to][1]=p1;
37             else if(dis[to][1]>dis[x][1]+e[i].w)ff=1,dis[to][1]=dis[x][1]+e[i].w;
38             if(!ok[to]&&ff){
39                 ok[to]=1;q[t++]=to;if(t>=5000)t=0;
40             }
41         }
42         ok[x]=0;
43     }
44 }
45 int main(){
46     n=read();m=read();
47     for(int i=1,a,b,c;i<=m;i++){
48         a=read();b=read();c=read();
49         add(a,b,c);
50     }
51     spfa();
52     printf("%d",dis[n][1]);
53     return 0;
54 }

Usaco2006

转载于:https://www.cnblogs.com/JKAI/p/7515779.html

【bzoj1726/Usaco2006 Nov】Roadblocks第二短路——SPFA相关推荐

  1. [BZOJ1726][Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1277  Solved: 607 ...

  2. bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路(A*第k短路)

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1324  Solved: 627 ...

  3. [Usaco2006 Nov]Roadblocks第二短路

    贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的 ...

  4. 【BZOJ】1726 [Usaco2006 Nov]Roadblocks第二短路

    [算法]最短路(spfa) 次短路 [题解] 正反跑两次SPFA,然后枚举每一条边,如果起点到一个端点的最短路+另一个端点到终点的最短路+长度 ≠ 最短路,则和答案比较,保存最小值. #include ...

  5. [BZOJ1724][Usaco2006 Nov]Fence Repair 切割木板

    1724: [Usaco2006 Nov]Fence Repair 切割木板 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1272  Solved: ...

  6. 1724: [Usaco2006 Nov]Fence Repair 切割木板( 贪心 )

    倒过来看 , 每次总是选择最短的两块木板合并 , 用heap维护 ------------------------------------------------------------------- ...

  7. BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数(数位DP+恶心细节)

    BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec  Memory Limit: 64 MB Description 正如你所知 ...

  8. BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板

    题目 1724: [Usaco2006 Nov]Fence Repair 切割木板 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer ...

  9. bzoj 1662: [Usaco2006 Nov]Round Numbers 圆环数(枚举)

    1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 413  Solved: 2 ...

最新文章

  1. 百年通信史:落后西方半世纪的中国,用 20 年绝地反杀! | 文末送福利
  2. 【百战GAN】羡慕别人的美妆?那就用GAN复制粘贴过来
  3. stagefright omx小结
  4. 【Linux】一步一步学Linux网络编程教程汇总(更新中......)
  5. function checkBrowser()//判断浏览器
  6. 基于VC的OPC客户端软件研究与实现
  7. html计算器_学习HTML、CSS和JavaScript的最佳方法是什么?
  8. bzoj1625[Usaco2007 Dec]宝石手镯*
  9. ND2D源码及范例工程(编译通过)
  10. python显示函数图像_python – 显示存储在函数中的图像
  11. 论Web控件开发 - 完美上传下载控件“新”(一)
  12. PyCharm主题更换
  13. android自定义上拉刷新,Android RecyclerView自定义上拉和下拉刷新效果
  14. 创建微信卡券 php
  15. 社保交了24年,还有十几年才到退休年龄。还有必要继续交下去吗?
  16. C4D和Maya哪个学起来更容易
  17. 二维数组的查找(每一行每一列都是递增顺序)?
  18. kafka 0.10.0.0 版本
  19. c语言程序设计中常用语句,单片机C语言编程常用语句
  20. (点击||敲击)发出声音特效「HTML+CSS+JavaScript」项目总结

热门文章

  1. flink 写kafka_网易云音乐基于 Flink + Kafka 的实时数仓建设实践
  2. java解决策略膨胀_折腾Java设计模式之策略模式
  3. (三) shiro通过jdbc连接数据库
  4. 最简单的打造淘宝商品爆款步骤
  5. docker maven 打包jar_maven 打包 spring boot 生成docker 镜像
  6. 【php7扩展开发六】zval的操作
  7. 使用gethostname()函数和gethostbyname()函数获取主机相关信息
  8. 《数据库SQL实战》查找当前薪水详情以及部门编号dept_no
  9. python学习笔记(一)基本数据类型
  10. 【十大经典数据挖掘算法】PageRank