[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算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...
随机推荐
- 最新最强短视频SDK——来自RDSDK.COM
北京锐动天地信息技术有限公司成立于2007年9月.多年来一直专注于音视频领域核心技术的研发, 拥有Windows.iOS.Android全平台自主知识产权的领先技术产品. 2011年获得新浪战略投资, ...
- 内存管理总结-autoreleasePool
转自其他 序言 无论是在MRC时期还是ARC时期,做过开发的程序员都接触过autoreleasepool.尽管接触过但本人对它还不是很了解.本文只是将自己的理解说出来.在内存管理的文章中提到了OC的内 ...
- Node.js——重定向
- adobe开发软件激活
稳定支持至2017版本系列的adobe开发软件破解激活 本内容属原创,转载请注明出处! 以激活AE CC2017为例演示: 第一步打开软件第二步在产品列表中选择你所安装的产品(注意区分 32 位和 ...
- windos快捷键
F1帮助 F2改名 F3搜索 F4地址 F5刷新 F6切换 F10菜单 CTRL+A全选 CTRL+C复制 CTRL+X剪切 CTRL+V粘贴 CTRL+Z撤消 CTRL+O打开 SHIFT+DELE ...
- laravel JWTAuth实现api接口鉴权(基础篇)
官网:https://jwt-auth.readthedocs.io 参考:https://learnku.com/articles/10885/full-use-of-jwt#99529f 1.to ...
- JS日期,金钱处理
一丶获取两个时间的天数 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式
Windows 安装 amqp 扩展 RabbitMQ 是基于 amqp(高级消息队列协议) 协议的.使用 RabbitMQ 前必须为 PHP 安装相应的 amqp 扩展. 下载相应版本的 amqp ...
- 基于ant design form的二次封装
// standardForm.js import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; ...
- Java中List集合的遍历
一.对List的遍历有三种方式 List<String> list = new ArrayList<String>(); list.add("testone" ...