传送门

用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)的更多相关文章

  1. poj3463 Sightseeing——次短路计数

    题目:http://poj.org/problem?id=3463 次短路计数问题,在更新最短路的同时分类成比最短路短.长于最短路而短于次短路.比次短路长三种情况讨论一下,更新次短路: 然而其实不必被 ...

  2. poj3463&&hdu1688 次短路(dijkstra)

    A*算法超内存. 对于最短路,我们可以维护dis[]数组,来求得最短路,但是此题有次短路,所以定义dis[][2],dis[][0]表示最短路,dis[][1]表示次短路;cnt[][2],cnt[] ...

  3. 最短路计数——Dijkstra

    题目: 给出一个N个顶点M条边的无向无权图,顶点编号为1−N.问从顶点1开始,到其他每个点的最短路有几条. ——传送门 受到题解的启发,用 Dijkstra A掉(手工代码) 思路: 1.无向无权图, ...

  4. POJ3463【次短路】

    转自:http://www.cnblogs.com/jackge/archive/2013/04/29/3051273.html 算法:最短路和次短路.Dijkstra算法.采用邻接表建图. 总结:不 ...

  5. POJ---3463 Sightseeing 记录最短路和次短路的条数

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9247   Accepted: 3242 Descr ...

  6. poj 3463 Sightseeing( 最短路与次短路)

    http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  7. BZOJ 3040: 最短路(road) [Dijkstra + pb_ds]

    3040: 最短路(road) Time Limit: 60 Sec  Memory Limit: 200 MBSubmit: 2476  Solved: 814[Submit][Status][Di ...

  8. Radix Heap ---Dijkstra算法的优化 BY Gremount

    Radix Heap 算法是在Dijkstra的Dial实现的基础上,通过减少对桶的使用,来优化算法的时间复杂度: Dial 时间复杂度是O(m+nC)     -------C是最长的链路 Radi ...

  9. 10行实现最短路算法——Dijkstra

    今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...

随机推荐

  1. 题解报告:hdu1219AC Me

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1219 Problem Description Ignatius is doing his homewo ...

  2. 多功能Markdown编辑器MarkdownPad 2的下载、安装和初步使用步骤(图文详解)(博主推荐)

    不多说,直接上干货!   MarkdownPad 是什么? 一.MarkdownPad 2的下载 http://markdownpad.com/download/markdownpad2-setup. ...

  3. dockerfile构建的镜像

    转载请注明出处 https://www.cnblogs.com/majianming/p/9536975.html 在每执行一个命令时,便会commit形成一个层,最后形成堆栈式的结构.最后的镜像是各 ...

  4. .net主站和二级域名下实现session共享

    public class CrossDomainCookie : IHttpModule { private string m_RootDomain = string.Empty; #region I ...

  5. java基础(六):RabbitMQ 入门

    建议先了解为什么项目要使用 MQ 消息队列,MQ 消息队列有什么优点,如果在业务逻辑上没有此种需求,建议不要使用中间件.中间件对系统的性能做优化的同时,同时增加了系统的复杂性也维护难易度:其次,需要了 ...

  6. ES3之bind方法的实现模拟

    扩展Function原型方法,此处用myBind来模拟bind实现 Function.prototype.myBind = function(o /*,args*/){       //闭包无法获取t ...

  7. 波哥!一个不安分的IT男

    第一篇博文,紧张,窃喜,辣眼睛! 这个订阅号主要是写给自己的,近期越来越发现记忆力不如以前了! 时光如梭,岁月荏苒,或许这两句经典的开头文比较契合自己的年纪.依稀记得几年前还在组装服务器.搬机柜.做系 ...

  8. tomcat 启动失败 和闪退 和 启动成功却没有页面显示

    1.解压版tomcat 将tomcat解压至英文目录下, 在系统环境变量里面配置 JAVA_HOME 和CATALINA_HOME (就是tomcat的安装目录) 在path中配置 %CATALINA ...

  9. CentOS 7 挂载ntfs磁盘格式的U盘

    因为CentOS 默认不识别NTFS的磁盘格式,所以我们要借助另外一个软件来挂载,那就是ntfs-3g了 自带的yum源没有这个软件,要用第三方的软件源,这里我用的是阿里的epel. 1. 切换到系统 ...

  10. CREATE TABLE AS - 从一条查询的结果中创建一个新表

    SYNOPSIS CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [, ...] ...