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位置对每个位置的贡献打表发现 第一次 贡献为 ...
随机推荐
- ES6简介
function fn(){ return 100; } let name='sui'; let age=19; let sui={ name, age, ["pro"+fn()] ...
- HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)
HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...
- UltraEdit MAC破解方法
在终端输入 printf '\x31\xC0\xFF\xC0\xC3\x90' | dd seek=$((0x92D370)) conv=notrunc bs=1 of=/Applications/U ...
- 一个简单的java贷款程序
代码如下: //计算贷款package ClassDemo;import javax.swing.JOptionPane; public class ComputeLoan { public stat ...
- new DefaultHttpClient过时处理建议和HTTP调用后关闭流处理
因为工作中经常会写点接口类需求,写完HTTP的接口后,就要写测试类来调下服务端的代码.最近写新的测试调用代码时候,发现项目中new DefaultHttpClient()实例过期很久了,于是查阅了些资 ...
- JavaScript获取鼠标位置的三种方法
在一些DOM操作中我们经常会跟元素的位置打交道,鼠标交互式一个经常用到的方面,令人失望的是不同的游览器下会有不同的结果甚至是有的游览器下没结果,这篇文章就鼠标点击位置坐标获取做一些简单的总结. 获取鼠 ...
- (转)IntelliJ IDEA 破解方法
1.下载破解包http://pan.baidu.com/s/1gf9fXx5 2.解压并打开选中的文件 3.如图 4.IDEA选择License Server输入 http://127.0.0.1:1 ...
- swift3.0 CoreGraphics绘图-实现画板
swift3.0对绘图的API进行了优化,看起来更swift了. 看下UI的构造.设置画笔粗细.清空面板和保存到本地 下面直接看画板文件 这里我做的比较复杂,记录触摸到的每个点,再连成路径,其实直接用 ...
- Ubuntu16.04配置Mac主题
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7072878.html 觉得有帮助?欢迎来打赏 Ubuntu配置Mac主题 下 ...
- python3网络编程之socket
文章内容: socket介绍 socket参数介绍 流程描述 socket对象内建方法 基本socket实例 通过socket实现简单ssh并实现接收大数据 socket介绍 socket又称&quo ...