题目:http://poj.org/problem?id=3463

次短路计数问题,在更新最短路的同时分类成比最短路短、长于最短路而短于次短路、比次短路长三种情况讨论一下,更新次短路;

然而其实不必被“同时”限制,否则就容易像我一开始一样写挂...

像拆点一样把最短路和次短路完全分开,放进 dijkstra 的优先队列里,真是巧妙;

还要注意一点是直接更新最短路之后要把它的次短路也加进优先队列里,因为次短路同时也被更新了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int const maxn=,maxm=;
int T,n,m,head[maxn],ct,dis[maxn][],f[maxn][],s,t;
bool vis[maxn][];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[maxm];
struct P{
int bh,d,fl;
P(int b=,int d=,int f=):bh(b),d(d),fl(f) {}
bool operator < (const P &y) const
{
return d>y.d;//priority_queue是从大到小排序
}
};
priority_queue<P>q;
void dijkstra()
{
while(q.size())q.pop();
memset(vis,,sizeof vis);
memset(f,,sizeof f);
memset(dis,0x3f,sizeof dis);
dis[s][]=; f[s][]=; q.push(P(s,,));
while(q.size())
{
int x=q.top().bh,d=q.top().d,fl=q.top().fl; q.pop();
if(vis[x][fl])continue;
vis[x][fl]=;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to,w=edge[i].w;
if(dis[u][]>d+w)
{
dis[u][]=dis[u][]; f[u][]=f[u][];
dis[u][]=d+w; f[u][]=f[x][fl];
q.push(P(u,dis[u][],));
q.push(P(u,dis[u][],));//!
}
else if(dis[u][]==d+w)
f[u][]+=f[x][fl];
else if(dis[u][]>d+w)
{
dis[u][]=d+w; f[u][]=f[x][fl];
q.push(P(u,dis[u][],));
}
else if(dis[u][]==d+w)
f[u][]+=f[x][fl];
}
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(head,,sizeof head); ct=;
scanf("%d%d",&n,&m);
for(int i=,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
edge[++ct]=N(y,head[x],z); head[x]=ct;
}
scanf("%d%d",&s,&t);
dijkstra();
if(dis[t][]==dis[t][]+)f[t][]+=f[t][];
printf("%d\n",f[t][]);
}
return ;
}

poj3463 Sightseeing——次短路计数的更多相关文章

  1. POJ - 3463 Sightseeing 最短路计数+次短路计数

    F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...

  2. poj 3463 Sightseeing——次短路计数

    题目:http://poj.org/problem?id=3463 当然要给一个点记最短路和次短路的长度和方案. 但往优先队列里放的结构体和vis竟然也要区分0/1,就像把一个点拆成两个点了一样. 不 ...

  3. 洛谷P1144 最短路计数 及其引申思考

    图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...

  4. 【SPFA】 最短路计数

    最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. ...

  5. P1144 最短路计数

    P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...

  6. 洛谷P1144最短路计数题解

    最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...

  7. 洛谷P1144 最短路计数(SPFA)

    To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...

  8. 2018.11.05 NOIP模拟 规避(最短路计数)

    传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...

  9. 洛谷 P1144 最短路计数 解题报告

    P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...

随机推荐

  1. day02python

    ''' 列表 定义:在[]内,可以存放多个任意类型的值,并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... ''' students=['钱垚','李小龙','张全蛋','赵铁柱'] pri ...

  2. PHP 加密:Password Hashing API

    PHP 5.5 之后引入 Password hashing API 用于创建和校验哈希密码,它属于内核自带,无需进行任何扩展安装和配置.它主要提供了四个函数以供使用: password_hash(): ...

  3. maven deploy时报错

    Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on p ...

  4. 个人总结的常用java,anroid网站

    http://blog.csdn.net/wanghao200906/article/details/49334987

  5. Python selenium chrome打包exe后禁用控制台输出滚动日志

    Python selenium chrome打包exe后,在运行的过程中,如果遇到需要input()输入时,会发现被不断滚动刷新的日志把命令行输入快速顶掉了,通过查阅资料不断实践,发现以下方法有效: ...

  6. 关于python字典中文显示的处理办法

    最近工作中遇到字典包含中文,显示\uxxxx的问题,怎么转换都无法输入正常的中文:{"gc": "\u4eba\u751f\u7f8e\u597d", &quo ...

  7. Divide Groups 二分图的判定

    Divide Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  8. ebay 如何获取用户token

    1. 首先 配置环境加载依赖的ebay SDK 下载地址 https://go.developer.ebay.com/ebay-sdks 需要在本地仓库安装下面的jar mvn install:ins ...

  9. slf4j+log4j2的配置

    昨天自己测试了一下slf4j+log4j2的配置,可以正常使用,虽然配置十分简单,但好记性不如烂笔头,想想还是记录下来吧. 运行的环境:jdk1.7.tomcat7.Maven的web项目 1.在新建 ...

  10. Java基础学习总结(85)——Java中四种线程安全的单例模式实现方式