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

http://acm.hdu.edu.cn/showproblem.php?pid=1688

求出最短路的条数比最短路大1的次短路的条数和,基本和上题一样,最后需判断是否满足dist[t][0]+1==dist[t][1];

cnt[i][0]表示到达点i最短的路有多少条,cnt[i][1]表示次短的条数

dist[i][0]表示到达点i最短路的长度,dist[i][1]表示次短路的长度



用v去松驰u时有四种情况 (设当前dist[v][cas])

情况1:dist[u][fag]+w(v,u)<dist[v][0],找到一个更短的距离,则把原来最短的距离作为次短的距离,同时更新最短的.把(v,0)和(v,1)放入队列


情况2:dist[u][flag]+w(v,u)==dist[v][0],找到一条新的相同距离的最短路,则cnt[v][0]+=cnt[u][flag],不入队

情况3:dist[u][flag]+w(v,u)<dist[v][1],情况4:dist[u][flag]+w(v,u)==dist[v][1] 对次短边的操作参照以上的完成即可。

注意:注意特判dist[v][0] != inf,放置插入了不该插入的(v,1)

优先队列cmp结构体的书写

#pragma comment(linker, "/STACK:36777216")
#pragma GCC optimize ("O2")
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define clr0(x) memset(x,0,sizeof(x))
#define clr1(x) memset(x,-1,sizeof(x))
#define eps 1e-9
const double pi = acos(-1.0);
typedef long long LL;
typedef unsigned long long ULL;
const int modo = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int inf = 0x3fffffff;
const LL _inf = 1e18;
const int maxn = 1005,maxm = 10005;
struct edge{
int v,w,next;
edge(){};
edge(int vv,int ww,int nnext):v(vv),w(ww),next(nnext){};
}e[maxm<<1];
int head[maxn],inq[maxn][2],dist[maxn][2],cnt[maxn][2];//0最短1次短
int n,m,ecnt;
void init()
{
clr1(head);
ecnt = 0;
for(int i = 1;i <= n;++i)
dist[i][0] = dist[i][1] = inf;
//fill(dist,dist+maxn*2,inf);
clr0(inq),clr0(cnt);
}
void add(int u,int v,int w)
{
e[ecnt] = edge(v,w,head[u]);
head[u] = ecnt++;
// e[ecnt] = edge(u,w,head[v]);
// head[v] = ecnt++;
}
typedef pair<int,int> p2;
struct cmp {
bool operator() (const p2 &a, const p2 &b)
{
return dist[a.first][a.second] > dist[b.first][b.second];
}
};
void spfa(int src,int dst)
{
priority_queue<p2 , vector<p2> , cmp> q;
q.push(make_pair(src,0));
dist[src][0] = 0,cnt[src][0] = 1;
while(!q.empty()){
int u = q.top().first,flag = q.top().second;
q.pop();
if(inq[u][flag]) continue;
inq[u][flag] = 1;
for(int i = head[u];i != -1;i = e[i].next){
int v = e[i].v,w = e[i].w;
if(!inq[v][0] && dist[v][0] > dist[u][flag] + e[i].w){
if(dist[v][0] != inf){
dist[v][1] = dist[v][0];
cnt[v][1] = cnt[v][0];
q.push(make_pair(v,1));
}
dist[v][0] = dist[u][flag] + e[i].w;
cnt[v][0] = cnt[u][flag]; q.push(make_pair(v,0));
}else if(!inq[v][0] && dist[v][0] == dist[u][flag] + e[i].w){
cnt[v][0] += cnt[u][flag];
}else if(!inq[v][1] && dist[v][1] > dist[u][flag] + e[i].w){
dist[v][1] = dist[u][flag] + e[i].w;
cnt[v][1] = cnt[u][flag]; q.push(make_pair(v,1));
}else if(!inq[v][1] && dist[v][1] == dist[u][flag] + e[i].w){
cnt[v][1] += cnt[u][flag];
}
}
}
//printf("%d %d\n",dist[dst][1],dist[dst][0]);
if(dist[dst][1] == dist[dst][0] + 1)
printf("%d\n",cnt[dst][1] + cnt[dst][0]);
else printf("%d\n",cnt[dst][0]);
} int main(){
int u,v,w,_,s,t;
RD(_);
while(_--){
RD2(n,m);
init();
while(m--){
RD3(u,v,w);
add(u,v,w);
}
RD2(s,t);
spfa(s,t);
}
return 0;
}

poj 3463/hdu 1688 求次短路和最短路个数的更多相关文章

  1. poj 3635/hdu 1676 Full Tank? 车辆加油+最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=1676 给出一张图,n<=1000,m<=10000. 有一辆车想从图的一个地方到达另外一个地方,每个 ...

  2. poj 1144 Network 【求一个网络的割点的个数 矩阵建图+模板应用】

    题目地址:http://poj.org/problem?id=1144 题目:输入一个n,代表有n个节点(如果n==0就结束程序运行). 在当下n的这一组数据,可能会有若干行数据,每行先输入一个节点a ...

  3. HDU 1688 Sightseeing&HDU 3191 How Many Paths Are There(Dijkstra变形求次短路条数)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. POJ 3463 有向图求次短路的长度及其方法数

    题目大意: 希望求出走出最短路的方法总数,如果次短路只比最短路小1,那也是可取的 输出总的方法数 这里n个点,每个点有最短和次短两种长度 这里采取的是dijkstra的思想,相当于我们可以不断找到更新 ...

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

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

  6. HDU 1688 Sightseeing 【输出最短路+次短路条数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题目大意:给n个点,m条有向边.再给出起点s, 终点t.求出s到t的最短路条数+次短路条数. 思 ...

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

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

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

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

  9. POJ 3463 Sightseeing (次短路)

    题意:求两点之间最短路的数目加上比最短路长度大1的路径数目 分析:可以转化为求最短路和次短路的问题,如果次短路比最短路大1,那么结果就是最短路数目加上次短路数目,否则就不加. 求解次短路的过程也是基于 ...

随机推荐

  1. 3A - Holding Bin-Laden Captive!

    We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But rec ...

  2. BOM心得-定时器

    写在前面的话:之前一直以为定时器的返回值是Object类型,所以timer初始化也是写null,今天发现返回值是number,进而发觉这个返回值代表的是定时器的索引,指代这是第几个定时器 个人觉得只用 ...

  3. L1-033 出生年(15)(STL-set代码)

    L1-033 出生年(15 分) 以上是新浪微博中一奇葩贴:"我出生于1988年,直到25岁才遇到4个数字都不相同的年份."也就是说,直到2013年才达到"4个数字都不相 ...

  4. BZOJ2730或洛谷3225 [HNOI2012]矿场搭建

    BZOJ原题链接 洛谷原题链接 显然在一个点双连通分量里,无论是哪一个挖煤点倒塌,其余挖煤点就可以互相到达,而对于一个点双连通分量来说,与外界的联系全看割点,所以我们先用\(tarjan\)求出点双连 ...

  5. python 读取xml

    #!/usr/bin/python # -*- coding: UTF- -*- from xml.dom.minidom import parse import xml.dom.minidom # ...

  6. 使用GZipStream压缩和解压文件

    最近做了一个用.NET里的GZipStream压缩解压缩gzip文件的小程序. GZipStream在System.IO.Compression底下,使用起来也很简单.虽然GZipStream是Str ...

  7. Maven中maven-source-plugin,maven-javadoc-plugin插件的使用

    摘要:今天领导说要把项目通过maven生产源码包和文档包并发布到自己的私服上,经过查看mavne官网发现有两个maven插件可以做到这些工作,一个是maven-source-plugin,另一个是ma ...

  8. Ubuntu上搭建Hadoop环境(单机模式+伪分布模式) (转载)

    Hadoop在处理海量数据分析方面具有独天优势.今天花了在自己的Linux上搭建了伪分布模式,期间经历很多曲折,现在将经验总结如下. 首先,了解Hadoop的三种安装模式: 1. 单机模式. 单机模式 ...

  9. 关于Web应用开发流程的总结

    以下内容为个人工作总结,如果不当,谢谢指出错误. 假设最简单的情况,一个开发人员,开发所有的代码,一个测试人员.一个测试的服务器,一个生产的服务器. 开发人员需要为公司开发一个项目,开发人员首先分析产 ...

  10. python上下文管理协议

    所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_va ...