[POJ3463] Sightseeing(次短路 Heap + Dijkstra)
用dijkstra比较好,spfa可能有的重复
dis[x][2]:dis[x][0]表示起点到x的最短路、dis[x][1]表示起点到x的次短路;
tot[x][2]:tot[x][0]表示起点到x的最短路条数、tot[x][1]表示起点到x的次短路的条数;
vis[x][2]对应于x和0、1功能为记录该点是否被访问!
那么如何更新最小和次小路呢?显然我们容易想到下面的方法:
1.if(x<最小)更新最小,次小;
2.else if(x==最小)更新方法数;
3.else if(x<次小)更新次小;
4.else if(x==次小)更新方法数;
——代码
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; struct heap
{
int x, y, z;
heap(int x = , int y = , int z = ) : x(x), y(y), z(z) {}
bool operator < (const heap &rhs) const
{
return y > rhs.y;
}
}; const int MAXM = , MAXN = ;
int T, n, m, cnt;
int dis[MAXN][], head[MAXN], to[MAXM << ], next[MAXM << ], val[MAXM << ], tot[MAXN][];
priority_queue <heap> q;
bool vis[MAXN][]; inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline void add(int x, int y, int z)
{
to[cnt] = y;
val[cnt] = z;
next[cnt] = head[x];
head[x] = cnt++;
} inline void dijkstra(int s)
{
int i, u, v, d, p;
heap now;
memset(vis, , sizeof(vis));
memset(tot, , sizeof(tot));
memset(dis, / , sizeof(dis));
dis[s][] = ;
tot[s][] = ;
q.push(heap(s, , ));
while(!q.empty())
{
now = q.top();
q.pop();
u = now.x;
p = now.z;
if(vis[u][p]) continue;
vis[u][p] = ;
for(i = head[u]; i ^ -; i = next[i])
{
v = to[i];
if(dis[v][] > dis[u][p] + val[i])
{
dis[v][] = dis[v][];
tot[v][] = tot[v][];
dis[v][] = dis[u][p] + val[i];
tot[v][] = tot[u][p];
q.push(heap(v, dis[v][], ));
q.push(heap(v, dis[v][], ));
}
else if(dis[v][] == dis[u][p] + val[i]) tot[v][] += tot[u][p];
else if(dis[v][] > dis[u][p] + val[i])
{
dis[v][] = dis[u][p] + val[i];
tot[v][] = tot[u][p];
q.push(heap(v, dis[v][], ));
}
else if(dis[v][] == dis[u][p] + val[i]) tot[v][] += tot[u][p];
}
}
} int main()
{
int i, j, x, y, z, s, t;
T = read();
while(T--)
{
n = read();
m = read();
cnt = ;
memset(head, -, sizeof(head));
for(i = ; i <= m; i++)
{
x = read();
y = read();
z = read();
add(x, y, z);
}
s = read();
t = read();
dijkstra(s);
if(dis[t][] == dis[t][] + ) tot[t][] += tot[t][];
printf("%d\n", tot[t][]);
}
}
[POJ3463] Sightseeing(次短路 Heap + Dijkstra)的更多相关文章
- poj3463 Sightseeing——次短路计数
题目:http://poj.org/problem?id=3463 次短路计数问题,在更新最短路的同时分类成比最短路短.长于最短路而短于次短路.比次短路长三种情况讨论一下,更新次短路: 然而其实不必被 ...
- poj3463&&hdu1688 次短路(dijkstra)
A*算法超内存. 对于最短路,我们可以维护dis[]数组,来求得最短路,但是此题有次短路,所以定义dis[][2],dis[][0]表示最短路,dis[][1]表示次短路;cnt[][2],cnt[] ...
- 最短路计数——Dijkstra
题目: 给出一个N个顶点M条边的无向无权图,顶点编号为1−N.问从顶点1开始,到其他每个点的最短路有几条. ——传送门 受到题解的启发,用 Dijkstra A掉(手工代码) 思路: 1.无向无权图, ...
- POJ3463【次短路】
转自:http://www.cnblogs.com/jackge/archive/2013/04/29/3051273.html 算法:最短路和次短路.Dijkstra算法.采用邻接表建图. 总结:不 ...
- POJ---3463 Sightseeing 记录最短路和次短路的条数
Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9247 Accepted: 3242 Descr ...
- poj 3463 Sightseeing( 最短路与次短路)
http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- BZOJ 3040: 最短路(road) [Dijkstra + pb_ds]
3040: 最短路(road) Time Limit: 60 Sec Memory Limit: 200 MBSubmit: 2476 Solved: 814[Submit][Status][Di ...
- Radix Heap ---Dijkstra算法的优化 BY Gremount
Radix Heap 算法是在Dijkstra的Dial实现的基础上,通过减少对桶的使用,来优化算法的时间复杂度: Dial 时间复杂度是O(m+nC) -------C是最长的链路 Radi ...
- 10行实现最短路算法——Dijkstra
今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...
随机推荐
- SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon
通过上一章<SpringCloud开发学习总结(三)—— 服务治理Eureka>,我们已经搭建起微服务架构中的核心组件——服务注册中心(包括单点模式和高可用模式).同时还注册了一个服务,命 ...
- 应用CSS样式表
首先应该分清楚应用CSS样式表到HTML页面中和将css样式表绑定到HTML页面的对象,是两个不同的概念.像之前说的通过不同的选择器将样式表绑定到HTML页面中的对象,但其实使用的都是同一种方法应用c ...
- [书目20150303]软件工程的本质:运用SEMAT内核
译者序Robert Martin作序Bertrand Meyer作序Richard Soley作序前言致谢第一部分 内核思想解释第1章 简要介绍如何使用内核1.1 为什么开发优秀软件具有很 ...
- 2019最新Android面试题
原文链接:https://blog.csdn.net/wen_haha/article/details/88362469版权声明:本文为博主原创文章,转载请附上博文链接! 前言 金三银四到来了,找工作 ...
- 工厂方法模式及php实现
工厂方法模式: 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Facto ...
- iOS 画环形图
由于新项目的的需求,需要画环形图,由于以前都没接触过这一类(我是菜鸟),去cocochina山找到了一个案例,个人觉得还可以,分享一下 github 地址https://github.com/zhou ...
- 在Windows7下编译调试C#程序
要在 命令行下编译C#代码,要配置一下 1.在环境变量下新建一个变量 参数名: csc 参数值:C:\Windows\Microsoft.NET\Framework\v4.0.30319 2.在系统变 ...
- Java字符串操作方法集
常用Java字符串操作方法 String s="Hello" String s2="World" 操作 方法 使用方法 结果 字符串截取 substring ...
- PMP项目管理学习笔记(2)——组织、约束和干系人
(一)组织 这里所说的组织,就是我们所说的团队组织架构. 1.组织的类型 职能型: 在这种组织中,项目团队成员总是向职能经理报告,所有事务都有职能经理全权负责. 项目经理的决策需要与职能经理确认. 项 ...
- H.264学习笔记3——帧间预测
帧间预测主要包括运动估计(运动搜索方法.运动估计准则.亚像素插值和运动矢量估计)和运动补偿. 对于H.264,是对16x16的亮度块和8x8的色度块进行帧间预测编码. A.树状结构分块 H.264的宏 ...