2017多校第10场 HDU 6181 Two Paths 次短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181
题意:给一个图,求出次短路。
解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证明这题数据还是水了。下来我修改了一下次短路的,就可以避免这种情况了。提供一个sample 4 4
(1,2,1)( 1, 3,1) (2 4,1) (3 ,4,1)。这组的正确答案是2,算法就来看代码吧。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL maxn = 100010;
LL n, m;
LL ST, EN;
LL num, pos[maxn];
LL vis[maxn][2];
LL cnt[maxn][2], dis[maxn][2];
struct node1
{
LL en, val, next;
node1(LL en = 0, LL val = 0, LL next = 0): en(en), val(val), next(next) {}
} E[maxn * 2];
struct node
{
LL id;
LL val;
LL flag; //最短/次短
node(LL id = 0, LL val = 0, LL flag = 0): id(id), val(val), flag(flag) {}
friend bool operator <(node x, node y)
{
return x.val > y.val;
}
};
void add(LL st, LL en, LL val)
{
E[num] = node1(en, val, pos[st]);
pos[st] = num++;
}
void dij()
{
dis[ST][0] = 0;
cnt[ST][0] = 1;
priority_queue<node>q;
q.push(node(ST, 0, 0));
while (!q.empty())
{
node now = q.top();
q.pop();
LL val = now.val;
LL u = now.id ;
LL flag = now.flag;
if (vis[u][flag]) continue;
vis[u][flag] = 1;
for (LL i = pos[u]; i != -1; i = E[i].next)
{
LL v = E[i].en;
LL newlen = val + E[i].val;
if (newlen <= dis[v][0]) //新路径比原最短路更小
{
if (dis[v][0] != INF) //如果当前点的最短路曾更新过
{
//那么不仅更新最短,也要更新次短
dis[v][1] = dis[v][0];
cnt[v][1] = cnt[v][0]; //次短路条数等于原来的最短路条数
q.push(node(v, dis[v][1], 1)); //入队,当前点距离更新,之后的也会更新
}
dis[v][0] = newlen; //否则仅更新最短路
cnt[v][0] = cnt[u][flag]; //更新最短路条数,最短路条数由u点得到,u点状态由flag标记
q.push(node(v, newlen, 0));
}
else if (newlen == dis[v][0])
cnt[v][0] += cnt[u][flag]; //增加最短路条数
else if (newlen == dis[v][1])
cnt[v][1] += cnt[u][flag]; //增加次短路条数
else if (newlen < dis[v][1]) //新路径大于最短路,但是小于次短路,更新次短路
{
dis[v][1] = newlen;
cnt[v][1] = cnt[u][flag]; //次短路条数由u点得
q.push(node(v, dis[v][1], 1));
}
}
}
}
void init()
{
num = 0;
memset(cnt, 0, sizeof(cnt));
memset(vis, 0, sizeof(vis));
memset(E, 0, sizeof(E));
memset(pos, -1, sizeof(pos));
memset(dis, 0x3f, sizeof(dis));
} int main()
{
LL T;
scanf("%lld", &T);
while(T--)
{
init();
scanf("%lld %lld", &n,&m);
while(m--){
LL u, v, w;
scanf("%lld%lld%lld", &u,&v,&w);
add(u, v, w);
add(v, u, w);
}
ST = 1;
EN = n;
dij();
printf("%lld\n", dis[EN][1]);
}
return 0;
}
2017多校第10场 HDU 6181 Two Paths 次短路的更多相关文章
- 2017多校第10场 HDU 6178 Monkeys 贪心,或者DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:给出一棵有n个节点的树,现在需要你把k只猴子放在节点上,每个节点最多放一只猴子,且要求每只 ...
- 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...
- 2017多校第10场 HDU 6180 Schedule 贪心,multiset
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6180 题意:给了一些任务的开始时间和终止时间,现在让我们安排k台及机器,让这些任务在k太机器上最小,并 ...
- 2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6172 题意:如题. 解法: #include <bits/stdc++.h> using ...
- 2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6161 题意: 题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号, ...
- 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...
- 2017多校第8场 HDU 6138 Fleet of the Eternal Throne AC自动机或者KMP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6138 题意:给n个串,每次询问x号串和y号串的最长公共子串的长度,这个子串必须是n个串中某个串的前缀 ...
- 2017多校第8场 HDU 6134 Battlestation Operational 莫比乌斯反演
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6134 题意: 解法: 那么g(n)怎么求,我们尝试打表发现g(n)是有规律的,g(n)=g(n-1)+ ...
- 2017多校第7场 HDU 6129 Just do it 找规律
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意:求a序列后m次xor前缀和 解法: 手动对1位置对每个位置的贡献打表发现 第一次 贡献为 ...
随机推荐
- JavaScript一个google地图获取
<script type="text/javascript"> /** * 返回一个新创建的<img>元素,该元素用于在获取到地理位置信息后,显示一张Goo ...
- js冒泡排序,数组去重
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Memcache+cookie实现模拟session
上一片讲到Memcached在Windows上的安装,和用Telnet工具进行命令操作,在稍微了解了原理之后,我也就开始尝试着用程序来对Memcached进行操作.这一篇分为两个部分,第一部分是用.n ...
- NOIP模拟:饼干(简单规律推导)
题目描述 小美有一张很大的网格:2 n * 2 n .每次小美会选一个小矩阵 2 x * 2 x , x > 0,小矩阵不能超过网格的边界.然后把右上一半都放上饼干.下图是当 x=1或2 的时候 ...
- SetConsoleTitle 函数--设置控制台窗口标题
SetConsoleTitle函数 来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686050(v=vs.85).aspx ...
- (转)Spring中Singleton模式的线程安全
不知道哪里的文章,总结性还是比较好的.但是代码凌乱,有的还没有图.如果找到原文了可以进行替换! spring中的单例 spring中管理的bean实例默认情况下是单例的[sigleton类型],就还有 ...
- Spring-Framework 源码阅读之AnnotationBeanUtils
Java程序员,就是要学会一个名字叫做"春"的东西,这玩意运用的非常的广泛,现在如果你的业务系统或者软件没有在这个东西上开发,都不要意思拿出来.因为你更不上时代了.在平时的工作的中 ...
- zookeeper+dubbo简单使用
首先下载zookeeper,直接百度官网下载即可! 下载完之后,把cfg配置文件改名为zoo.cfg,如下: 在bin目录下启动zkServer即可! 项目结构: 简单讲解:首先dubbo是一个mav ...
- Apache Kafka - 介绍
原文地址地址: http://blogxinxiucan.sh1.newtouch.com/2017/07/12/Apache-Kafka-介绍/ Apache Kafka教程 之 Apache Ka ...
- java服务端和用户端
1.server Logintherad: package com.zdsofe.server; import java.io.InputStream; import java.io.OutputSt ...