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位置对每个位置的贡献打表发现 第一次 贡献为 ...
 
随机推荐
- Spring3中@Value注解的使用
			
Spring可以通过@Value注解来直接获取properties文件里面配置的值. 1. 首先要在spring的配置文件中指明properties文件的位置: <context:propert ...
 - YAML文件解析
			
YAML是“另一种标记语言”的外语缩写,YAML 是一种比JSON(json多层次{ 与 [ 会被搞晕的)更直观的表现形式,展示上更易查错和关系描述.因为不需要一个专业工具就可以排查正确性.YAML目 ...
 - 4,JPA-Hibernate
			
一,什么是JPA JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA(Java Pers ...
 - win10下安装python2与python3以及pip共存
			
一 分别安装python2和python3 注意: 安装时记得勾选 Add Python.exe to Path 二 安装pip Python3最新版本有pip,无需安装 Python2: 下载pip ...
 - 读Zepto源码之Callbacks模块
			
Callbacks 模块并不是必备的模块,其作用是管理回调函数,为 Defferred 模块提供支持,Defferred 模块又为 Ajax 模块的 promise 风格提供支持,接下来很快就会分析到 ...
 - nyoj_61: 传纸条(一)
			
题目链接 使用双线dp,假设两个人同时从左上角移动到右下角,且满足路线不交叉,另k=x1+y1=x2+y2压缩状态进行优化.每次状态转移满足 x1,x2,y1,y2都在矩阵范围内,且(x2,y2)在相 ...
 - iOS App签名的原理
			
前言 相信很多同学对于iOS的真机调试,App的打包发布等过程中的各种证书.Provisioning Profile. CertificateSigningRequest.p12的概念是模糊的,导致在 ...
 - 新一代开源Android渠道包生成工具Walle
			
本文转自:http://tech.meituan.com/android-apk-v2-signature-scheme.html 新一代开源Android渠道包生成工具Walle 新的应用签名方案A ...
 - APP测试 - android os6,7 新增特性测试
			
背景 android os6,7推出后,公司的APP在市场上面反映的一些问题.初始方案在7月份已经整了一份,但是邮件发出大部分同学都看不到,这里在博客里面整理后再在部门内邮件发出来. android ...
 - python数据结构之队列
			
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First In First Out)的线性表,简称FIFO.允许插入的一端为队尾,允许删除的一端 ...