http://www.cnblogs.com/wally/archive/2013/04/16/3024490.html

http://blog.csdn.net/me4546/article/details/6584448

维护最短路长度d[i][0]和次短路d[i][1],最短路条数dp[i][0]和次短路dp[i][1]

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f struct Edge
{
int v,w;
};
vector<Edge> g[];
struct node
{
int v,dist;
int mark;//标记,0为最短路,1为次短路;
bool operator < (const node &p) const
{
if(p.dist != dist)
return p.dist<dist; return p.v<v;//这儿如果不按顶点的大小排序,就wa了。
}
}; int n,m,s,e;
int dist[][];
int dp[][];
bool vis[][];
//dp[i][0]表示到达点i最短的路有多少条,dp[i][1]表示次短的条数
//dist[i][0]表示到达点i最短路的长度,dist[i][1]表示次短路的长度
/*
用v去松驰u时有四种情况 (设当前dist[v][cas])
情况1:dist[v][cas]+w(v,u)<dist[u][0],找到一个更短的距离,则把原来最短的距离作为次短的距离,同时更新最短的.即
dist[u][1]=dist[u][0]
dist[u][0]=dist[v][cas]+w(v,u);
dp[u][1]=dp[u][0]
dp[u][0]=dp[v][cas],
把node(dist[u][0],u,0)和node(dist[u][1],u,1)放入队列
情况2:dist[v][cas]+w(v,u)==dist[u][0],找到一条新的相同距离的最短路,则dp[u][0]+=dp[v][cas],其他不用更新,也不入队
情况3:dist[v][cas]+w(v,u)<dist[u][1],不可以更新最短距离,但可以更新次短的,则更新dist[u][1]和dp[u][1]
dist[u][1]=dist[v][cas]+w(v,u);
dp[u][1]=dp[v][cas];
把node(dist[u][1],u,1)放入队列
情况4:dist[v][cas]+w(v,u)==dist[u][1] 找到一条新的相同距离的次短路,则dp[u][1]+=dp[v][cas],其他不更新。
*/ void dijkstra(int start,int end)
{
for(int i=;i<n;i++)
{
dist[i][]=dist[i][]=INF;
}
memset(dp,,sizeof(dp));
memset(vis,false,sizeof(vis));
priority_queue<node> Q;
node p,q;
dist[start][]=;
dp[start][]=;
p.dist=,p.mark=,p.v=start;
Q.push(p);
while(!Q.empty())
{
p=Q.top();
Q.pop();
if(vis[p.v][p.mark]) continue;
//if(dist[p.v][p.mark]!=p.dist)continue;
vis[p.v][p.mark]= true;
for(int i=;i<g[p.v].size();i++)
{
int v=g[p.v][i].v;
int w=g[p.v][i].w;
if(!vis[v][] && p.dist+w <dist[v][])
{
//可能为次短路
if(dist[v][]!=INF)
{
q.v=v,q.dist=dist[v][],q.mark=;
dist[v][]=dist[v][];
dp[v][]=dp[v][];
Q.push(q);
}
dist[v][]=p.dist+w;
dp[v][]=dp[p.v][p.mark];
q.v=v,q.dist=dist[v][],q.mark=;
Q.push(q);
}
else if(!vis[v][] && p.dist+w==dist[v][])
{
dp[v][]+=dp[p.v][p.mark];
}
else if(!vis[v][] && p.dist+w<dist[v][])
{
dist[v][]=p.dist+w;
dp[v][]=dp[p.v][p.mark];
q.dist=dist[v][],q.v=v,q.mark=;
Q.push(q);
}
else if(!vis[v][]&&p.dist+w==dist[v][])
{
dp[v][]+=dp[p.v][p.mark];
}
}
}
} int main(){
while(~scanf("%d%d%d%d",&n,&m,&s,&e))
{
for(int i=;i<n;i++)g[i].clear();
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
Edge p;
p.v=v,p.w=w;
g[u].push_back(p);
}
dijkstra(s,e);
printf("%d %d\n",dist[e][],dp[e][]);
}
return ;
}

HDU 3191 次短路长度和条数的更多相关文章

  1. hdu 3191 次短路的长度和个数

    http://acm.hdu.edu.cn/showproblem.php?pid=3191 求次短路的长度和个数 相关分析在这里http://blog.csdn.net/u012774187/art ...

  2. 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 ...

  3. HDU1688-POJ3463-Sightseeing(求次短路的条数)

    题意 求出最短路和次短路的条数,当次短路比最短路长度小1时,输出条数之和,反之输出最短路条数. 题解  dis1[],cnt1[],dis2[],cnt2[] 分别表示最短路的长度和条数,次短路的长度 ...

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

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

  5. HDU 3416 Marriage Match IV (求最短路的条数,最大流)

    Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...

  6. hdu 3191 How Many Paths Are There (次短路径数)

    How Many Paths Are There Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  7. HDU3191 【输出次短路条数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3191 How Many Paths Are There Time Limit: 2000/1000 M ...

  8. 最短路和次短路的条数(dijstra算法或spfa算法)POJ3463

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

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

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

随机推荐

  1. BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

    题目描述 Bob有一棵 nn 个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob ...

  2. 【spring】Spring Boot:定制自己的starter

    概念 在学习Spring Boot的过程中,接触最多的就是starter.可以认为starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring ...

  3. ZooKeeper参数

    原文连接:https://www.cnblogs.com/skyl/p/4854553.html ZooKeeper参数调优   zookeeper的默认配置文件为zookeeper/conf/zoo ...

  4. [原创] 项目 watch EMFILE 报错处理过程

    目录 事件 处理过程 参考资料 小知识点 单进程文件句柄限制 系统总文件句柄限制 inotify 文件系统事件监控 事件 公司XX游戏 S114服启动失败(使用 pomelo - node.js 框架 ...

  5. Smarty带来的神秘的数字1

    问题的引发:在htmly页面通过smarty模板引擎开启session_start()后,突发发现页面无故多了一个  神秘的数字 1 问题界面: 代码: 测试:在session_start()行末加2 ...

  6. 【算法笔记】B1050 螺旋矩阵

    1050 螺旋矩阵 (25 分)   本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行  ...

  7. HTML 标记大全参考手册

    1.文件结构 文件类型 <HTML></HTML> (放在文档的开头与结尾) 文件主题 <TITLE></TITLE> (必须放在「文头」区块内) 文头 ...

  8. python 面向过程和面向对象比较

    面向过程 VS 面向对象 面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是:复杂度 ...

  9. WinForm的Chart图形控件

    /// <summary>画条形图的方法 /// </summary> /// <param name="arr">条形值数组参数</pa ...

  10. 深刻理解Python中的元类(metaclass)(转)

    转载地址:http://blog.jobbole.com/21351/ 另外有几点理解记录下: 创建一个实例时,有时会传入参数,这些参数会同时传入 __init__() 和 __new__(),如: ...