poj3463 Sightseeing——次短路计数
题目: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——次短路计数的更多相关文章
- POJ - 3463 Sightseeing 最短路计数+次短路计数
F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...
- poj 3463 Sightseeing——次短路计数
题目:http://poj.org/problem?id=3463 当然要给一个点记最短路和次短路的长度和方案. 但往优先队列里放的结构体和vis竟然也要区分0/1,就像把一个点拆成两个点了一样. 不 ...
- 洛谷P1144 最短路计数 及其引申思考
图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...
- 【SPFA】 最短路计数
最短路计数 [问题描述] 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式] 输入第一行包含2个正整数N,M,为图的顶点数与边数. ...
- P1144 最短路计数
P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...
- 洛谷P1144最短路计数题解
最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
- 2018.11.05 NOIP模拟 规避(最短路计数)
传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...
- 洛谷 P1144 最短路计数 解题报告
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...
随机推荐
- Python学习笔记(2)数值类型
进制转换 int函数任意进制转换为10进制 第一个参数传入一个字符串,任意进制的,第二个参数传入对这个字符串的解释,解释他为几进制 hex oct bin转换进制为16 8 或者2进制 例题中石油87 ...
- 洛谷 3740 [HAOI2014]贴海报
[题解] 线段覆盖问题.线段树或者并查集都可以.不离散化居然能过? #include<cstdio> #include<algorithm> #define N 1000001 ...
- 3.5.6 关系和boolean运算符
Java包含丰富的关系运算符.要检测相等性,可以使用两个等号 == .例如, 3 == 7 的值为 false. 另外可以使用 != 检测不相等.例如, 3 ! = 7 的值 ...
- New Barns
New Barns 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Farmer John notices that his cows tend to get into argument ...
- [luoguP2983] [USACO10FEB]购买巧克力Chocolate Buying(贪心)
传送门 按价格排序后贪心 ——代码 #include <cstdio> #include <iostream> #include <algorithm> int n ...
- 转载 - C - 枚举类型详解
出处:http://www.cnblogs.com/JCSU/articles/1299051.html 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可 ...
- kuangbin专题最短路 D - Silver Cow Party
#include<iostream> #include<cstring> #include<algorithm> #include<iomanip> # ...
- Maticsoft Code Generator
源码:https://github.com/easonjim/MaticsoftCodeGenerator bug提交:https://github.com/easonjim/MaticsoftCod ...
- Tap into your Linux system with SystemTap
https://major.io/2010/12/07/tap-into-your-linux-system-with-systemtap/ December 7, 2010 By Major Hay ...
- react实现ssr服务器端渲染总结和案例(实例)
1.什么是 SSR SSR 是 server side render 的缩写,从字面上就可以理解 在服务器端渲染,那渲染什么呢,很显然渲染现在框架中的前后端分离所创建的虚拟 DOM 2.为什么要实现服 ...