题目:

POJ3255

洛谷2865

分析:

这道题第一眼看上去有点懵……

不过既然要求次短路,那估计跟最短路有点关系,所以就拿着优先队列优化的Dijkstra乱搞,搞着搞着就通了。

开两个数组:\(dis\)存最短路,\(dis2\)存次短路

在松弛的时候同时更新两个数组,要判断三个条件

(\(u\)是当前考虑的点,\(v\)是与\(u\)有边相连的点,\(d(u,v)\)表示从\(u\)到\(v\)的边长)

1.如果\(dis[v]>dis[u]+d(u,v)\),则更新\(dis[v]\)

2018.11.09Updated: 同时\(dis2[v]\)应成为原\(dis[v]\)。原代码有误,已更新。

2.如果\(dis[v]<dis[u]+d(u,v)\)(不能取等,否则\(dis2[v]\)和\(dis[v]\)可能相等)且\(dis2[v]>dis[u]+d(u,v)\),则更新\(dis2[v]\)

3.如果\(dis2[v]>dis2[u]+d(u,v)\),则更新\(dis2[v]\)(显然,如果2成立,更新后\(dis2[v]=dis[u]+d(u,v)<dis2[u]+d(u,v)\),即3一定不成立)

如果上述三个条件中有任意一个成立,则将\(v\)入队。

还要注意一个地方:因为次短路可能会走“回头路” (即成环) ,所以一个点可以多次进队,不能使用\(vis\)数组判重。

以及起点的\(dis2\)不能初始化为0,因为起点的次短路一定是沿着与其相连的最短的边走出去再回来。

代码:

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
int dis[5010],dis2[5010],n,m;
struct point
{
int id;
int dis;
bool operator<(const point &b)const
{
return dis>b.dis;
}
};
struct edge
{
int to;
int w;
};
priority_queue<point>q;
vector<edge>g[5010];
int main(void)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a].push_back((edge){b,c});
g[b].push_back((edge){a,c});
}
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(dis2,0x3f3f3f3f,sizeof(dis2));
dis[1]=0;
q.push((point){1,0});
while(!q.empty())
{
int u=q.top().id,d=q.top().dis;
q.pop();
if(d>dis2[u])continue;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].to,w=g[u][i].w;
bool flag=false;
if(dis[v]>dis[u]+w)
{
dis2[v]=dis[v];
dis[v]=dis[u]+w;flag=true;
}
if(dis[v]<dis[u]+w&&dis2[v]>dis[u]+w)
dis2[v]=dis[u]+w,flag=true; if(dis2[v]>dis2[u]+w)
dis2[v]=dis2[u]+w,flag=true; if(flag)q.push((point){v,dis[v]});
}
}
printf("%d",dis2[n]);
return 0;
}

【POJ3255/洛谷2865】[Usaco2006 Nov]路障Roadblocks(次短路)的更多相关文章

  1. 【洛谷 P2865】 [USACO06NOV]路障Roadblocks(最短路)

    题目链接 次短路模板题. 对每个点记录最短路和严格次短路,然后就是维护次值的方法了. 和这题一样. #include <cstdio> #include <queue> #in ...

  2. 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)

    洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...

  3. 【BZOJ2763/洛谷p4563】【分层图最短路】飞行路线

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4630  Solved: 1797[Submit][Stat ...

  4. 洛谷P1462-通往奥格瑞玛的道路-二分+最短路

    洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...

  5. BZOJ 1726 洛谷 2865 [USACO06NOV]路障Roadblocks【次短路】

    ·求1到n的严格次短路. [题解] dijktra魔改?允许多次入队,改了次短路的值也要入队. #include<cstdio> #include<algorithm> #de ...

  6. 洛谷P2865 [USACO06NOV]路障Roadblocks——次短路

    给一手链接 https://www.luogu.com.cn/problem/P2865 这道题其实就是在维护最短路的时候维护一下次短路就okay了 #include<cstdio> #i ...

  7. 2018.11.06 洛谷P1099 树网的核(最短路+枚举)

    传送门 之前看李煜东的书一直感觉是道神题. 然后发现这题数据范围只有300?300?300? 直接上floydfloydfloyd然后暴力就完了啊. 代码: #include<bits/stdc ...

  8. 2018.08.17 洛谷P3110 [USACO14DEC]驮运(最短路)

    传送门 一道sb最短路,从两个起点和终点跑一边最短路之后直接枚举两人的汇合点求最小值就行了. 代码: #include<bits/stdc++.h> #define N 40005 #de ...

  9. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

随机推荐

  1. c++行事准则

    1.c++包含多种编程范式,每种范式遵循不同的准则: 2.除了#include和#ifdef之流,其他预处理器别用,多用enum和const: 3.函数声明定义多用const:

  2. 【Codeforces 522B】Photo to Remember

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 模拟题.用set模拟下就好 [代码] import java.io.*; import java.util.*; public class M ...

  3. 使用pycharm学习django纪实

    之前已经下了python3.7 首先官网下载pycharm专业版,然后利用学生邮箱激活 新建django项目,使用虚拟环境就好了,方便之后的服务器部署(大概 找到博客开始学习:https://blog ...

  4. win7 32位机安装VMware win7 64位虚拟机

    VMware10虚拟机怎么安装win7系统(详细教程):https://jingyan.baidu.com/article/86f4a73ec62e8f37d65269a1.html 然而上述教程想不 ...

  5. MongoDB 数据文件备份与恢复

    备份与恢复数据对于管理任何数据存储系统来说都是非常重要的. 1.冷备份与恢复——创建数据文件的副本(前提是要停止MongoDB服务器),也就是直接copy MongoDB将所有数据都存储在数据目录下, ...

  6. Truck History(卡车历史)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26547   Accepted: 10300 Description Adv ...

  7. mappingLocations、mappingDirectoryLocations与mappingJarLocations 区别 (转)

    mappingLocations.mappingDirectoryLocations与mappingJarLocations 区别 由于spring对hibernate配置文件hibernate.cf ...

  8. codeforces gym 100357 K (表达式 模拟)

    题目大意 将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式. 解题分析 用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号.如 ...

  9. HDU——1133 Buy the Ticket

    Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  10. ADO连接ACCESS2007及以上版本的数据库

    function getaccessstr(databasename:string;password:string;accessVer:string='access2003'):string; beg ...