这是一道次短路的题

但是本题有两个坑

  1. 注意边权的范围,一定要在所有与距离有关的地方开 long long
  2. 本题所求的并不是次短路,而是与最短路不同的最短的路径,如果最短路不止一条,那么就输出最短路的长度
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN=400005;
long long init(){
long long rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return rv*fh;
}
long long n,m,T,dis[MAXN],dis2[MAXN],head[MAXN],nume;
struct edge{
long long to,nxt,dis;
}e[MAXN];
void adde(int from,int to,int dis){
e[++nume].to=to;
e[nume].dis=dis;
e[nume].nxt=head[from];
head[from]=nume;
}
struct cmp{
bool operator()(const int &a,const int &b)const{
return dis[a]>dis[b];
}
};
void sec_dij(){
memset(dis,0x3f,sizeof(dis));
int cnt[MAXN];
memset(dis2,0x3f,sizeof(dis2));
memset(cnt,0,sizeof(cnt));
dis[1]=0;
priority_queue <int,vector<int>,cmp> q;
q.push(1);
while(!q.empty()){
int u=q.top();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(dis[v]>dis[u]+e[i].dis){
long long t=dis[v];
dis[v]=dis[u]+e[i].dis;
if(dis2[v]>t) dis2[v]=t;
q.push(v);
}else if(dis[v]<dis[u]+e[i].dis){
if(dis[u]+e[i].dis<dis2[v]){
dis2[v]=dis[u]+e[i].dis;
q.push(v);
}
}
if(dis2[v]>dis2[u]+e[i].dis){
dis2[v]=dis2[u]+e[i].dis;
q.push(v);
}
}
}
queue <int> qq;
qq.push(n);
bool f[MAXN];
memset(f,0,sizeof(f));
f[n]=1;
while(!qq.empty()){
int u=qq.front();qq.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(dis[u]==dis[v]+e[i].dis){
cnt[u]++;
if(!f[v]) qq.push(v);
f[v]=1;
}
}
}
bool flag = 0;
for(int i = 1; i <= n; i++) if(cnt[i] >= 2) {flag = 1;break;}
if(flag) cout<<dis[n]<<endl;
else cout<<dis2[n]<<endl;
}
int main(){
T=init();
while(T--){
memset(e,0,sizeof(e));
memset(head,0,sizeof(head));
nume=0;
n=init();m=init();
for(int i=1;i<=m;i++){
int u=init(),v=init(),di=init();
adde(u,v,di);
adde(v,u,di);
}
sec_dij();
}
return 0;
}

HDU 6181 Two Paths的更多相关文章

  1. 2017多校第10场 HDU 6181 Two Paths 次短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181 题意:给一个图,求出次短路. 解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证 ...

  2. HDU - 6181 Two Paths(次短路)

    题意:求次短路. 分析:关键是情况讨论. LL tmpd = x.d + e.dist; 以下情况对应的更新结果 1.tmpd(2) < 最短路(3) < 次短路(4)-------> ...

  3. 【hdu 6181】Two Paths

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6181 [题意] 让你求从1到n的次短路 [题解] 模板题; 因为点可以重复走; 则一定会有次短路. di ...

  4. HDU 6181:Two Paths(次短路)

    Two Paths Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 153428/153428 K (Java/Others) Total S ...

  5. HDU 6181:Two Paths(A* + SPFA)

    题目链接 题意 给出n个点m条边的无向图,求次短路. 思路 和 POJ 2449 类似,只不过大小要开成long long. #include <bits/stdc++.h> using ...

  6. HDU 6181 第k短路

    Two Paths Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 153428/153428 K (Java/Others)Total ...

  7. hdu 4912 Paths on the tree(树链拆分+贪婪)

    题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...

  8. hdu 3191 How Many Paths Are There (次短路径数)

    How Many Paths Are There Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  9. HDU 1688 Sightseeing&HDU 3191 How Many Paths Are There(Dijkstra变形求次短路条数)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. [HDU3247]Resource Archiver

    AC自动机+状压DP 首先对所有串建AC自动机,然后对于每个资源串,算出从串末走到其他资源串末所需的距离(中途避开非法点) 也就是算出两两间的距离...然后就变成旅行商问题了. 计算距离的时候要考虑一 ...

  2. [bzoj1594] [Usaco2008 Jan]猜数游戏

    二分答案(二分没冲突的前Q-1个问题),用并查集判定(用法同bzoj 1576) 假设一个询问区间[l,r],最小干草堆数目是A,我们可以得出[l,r]上的干草堆数目都>=A. 二分出mid后, ...

  3. HDU_5563Clarke and five-pointed star

    Clarke and five-pointed star Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  4. ElasticSearch + xpack 使用.md

    ElasticSearch 是一个高可用开源全文检索和分析组件.提供存储服务,搜索服务,大数据准实时分析等.一般用于提供一些提供复杂搜索的应.我们为什么要选择 ElasticSearch ?因为它是一 ...

  5. c++2(循环和递归)

    其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就 ...

  6. [国嵌攻略][097][U-Boot新手入门]

    嵌入式软件层次 1.Bootloader 2.Linux内核 3.文件系统 编译U-Boot 1.解压uboot tar zxvf uboot.tar.gz 2.清除uboot make distcl ...

  7. 【转自知乎】:localhost、127.0.0.1 和 本机IP 三者的区别?

    作者:知乎用户链接:https://www.zhihu.com/question/23940717/answer/26230963来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  8. 97、爬虫框架scrapy

    本篇导航: 介绍与安装 命令行工具 项目结构以及爬虫应用简介 Spiders 其它介绍 爬取亚马逊商品信息   一.介绍与安装 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, ...

  9. window下spyder的快捷键

    块注释/块反注释 Ctrl + 4/5 断点设置 F12 关闭所有 Ctrl + Shift + W 代码完成 Ctrl +空格键 条件断点 SHIFT + F12 配置 F6 复制 Ctrl + C ...

  10. vi的常用命令

    https://zhidao.baidu.com/question/332242228.html vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ v ...