#10076.「一本通 3.2 练习 2」Roadblocks:https://loj.ac/problem/10076

解法:

  次短路具有一种性质:次短路一定是由起点到点x的最短路 + x到y的距离 + y到终点的最短路构成,且次短路的权值和严格大于最短路的权值和。

  我们可以从起点跑一次Dijkstra,再从终点跑一次Dijkstra,这样起点到每个点的最短距离以及终点到每个点的最短距离都已经确定了,

  接着枚举每一个节点u,再枚举从该点从发的每一条边v,更新答案就可以了。

  最后由于题目中的边可以重复走,所以把(u,v)的边权*3倍也计算进去就可以了。

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 5009
#define maxm 100009
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ll)(ch-'');ch=getchar();}
return x*f;
}
int head[maxn],dis[maxn],dist[maxn];
//dist 1->n的最短路 dis n->1的最短路
bool vis[maxn];
struct edge
{
int to,nxt,val;
}p[maxm<<];
int n,m,k,ans,tot,cnt,mx,sum; void add(int x,int y,int z)
{
++cnt,p[cnt].to=y,p[cnt].nxt=head[x],p[cnt].val=z,head[x]=cnt;
}
void Dijkstra(int x)
{
memset(dis,INF,sizeof(dis));
memset(vis,,sizeof(vis));
priority_queue<pair<int,int> >q;
dis[x]=;
q.push(make_pair(,x));
while(q.size())
{
int u=q.top().second;q.pop();
if(vis[u])
continue;
vis[u]=;
for(int i=head[u];i;i=p[i].nxt)
{
int v=p[i].to;
if(dis[v]>dis[u]+p[i].val)
{
dis[v]=dis[u]+p[i].val;
q.push(make_pair(-dis[v],v));
}
}
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read(),m=read();
for(int i=;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z),add(y,x,z);
}
Dijkstra();
for(int i=;i<=n;i++)
dist[i]=dis[i];
Dijkstra(n);
/* for(int i=1;i<=n;i++)
cout<<dist[i]<<" ";
cout<<endl;
for(int i=1;i<=n;i++)
cout<<dis[i]<<" ";
cout<<endl;*/
ans=INF;
for(int u=;u<=n;u++)
{
for(int i=head[u];i;i=p[i].nxt)
{
int v=p[i].to;
int diss=dist[u]+p[i].val+dis[v];
if(diss<ans&&diss>dist[n])
ans=diss;
diss+=p[i].val*;
if(diss<ans&&diss>dist[n])
ans=diss;
}
}
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return ;
}

Dijkstra求次短路的更多相关文章

  1. 关于dijkstra求最短路(模板)

    嗯....   dijkstra是求最短路的一种算法(废话,思维含量较低,   并且时间复杂度较为稳定,为O(n^2),   但是注意:!!!!         不能处理边权为负的情况(但SPFA可以 ...

  2. Aizu-2249 Road Construction(dijkstra求最短路)

    Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...

  3. ACM - 最短路 - AcWing 849 Dijkstra求最短路 I

    AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...

  4. 850. Dijkstra求最短路 II

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...

  5. 849. Dijkstra求最短路 I

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...

  6. POJ-2387(原始dijkstra求最短路)

    Til the Cows Come Home POJ-2387 这题是最简单的最短路求解题,主要就是使用dijkstra算法,时间复杂度是\(O(n^2)\). 需要注意的是,一定要看清楚题目的输入要 ...

  7. hdu1688(dijkstra求最短路和次短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题意:第k短路,这里要求的是第1短路(即最短路),第2短路(即次短路),以及路径条数,最后如果最 ...

  8. acwing 850. Dijkstra求最短路 II 模板

    地址 https://www.acwing.com/problem/content/description/852/ 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求 ...

  9. 850. Dijkstra求最短路 II(堆优化模板)

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行 ...

随机推荐

  1. ReactNative——页面跳转

    效果图: 进入工作目录,运行 react-native init NavigatorProject 创建项目NavigatorProject import React, { Component } f ...

  2. C#通讯录——Windows Form Contact List

    C#通讯录 Windows Form Contact List 主窗口 using System; using System.Collections.Generic; using System.Com ...

  3. mysql如何在一张表中插入一万条数据?(用存储过程解决)

    写一个存储过程,里面写一个循环,就可以了.主键你现在不是自增的,所以写语句的时候,就Insert到3个字段中. DELIMITER $$ DROP PROCEDURE IF EXISTS `proc_ ...

  4. 解决OS睡眠功能中,移动鼠标就会唤醒

    设备管理器,在相应项目上右键属性.

  5. 一脸懵逼学习HBase的搭建(注意HBase的版本)

    1:Hdfs分布式文件系统存的文件,文件存储. 2:Hbase是存储的数据,海量数据存储,作用是缓存的数据,将缓存的数据满后写入到Hdfs中. 3:hbase集群中的角色: ().一个或者多个主节点, ...

  6. Java中的IO流总结

    Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...

  7. PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://xxxx.wsdl'

    libxml_disable_entity_loader(false); $client = new \SoapClient($wsdl); 完美解决办法加上 php的soap扩展是否安装  open ...

  8. 【Arduino】开源开发板说明

    来自世界各地的新型微控制器层出不穷,这类开发板多数都是通过Arduino改进的版本,例如由Arduino所改良的Yún一样,主要是针对网状网路进行改进或升级了其它无线功能. 但一些开发板也有着其独到的 ...

  9. 向Spark集群提交任务

    1.启动spark集群. 启动Hadoop集群 cd /usr/local/hadoop/ sbin/start-all.sh 启动Spark的Master节点和所有slaves节点 cd /usr/ ...

  10. 51Nod1577 异或凑数 线性基

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1577.html 题意 给定一个长度为 n 的序列. 有 m 组询问,每一组询问给出 L,R,k ,询 ...