poj 3463/hdu 1688 求次短路和最短路个数
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 求次短路和最短路个数的更多相关文章
- poj 3635/hdu 1676 Full Tank? 车辆加油+最短路
http://acm.hdu.edu.cn/showproblem.php?pid=1676 给出一张图,n<=1000,m<=10000. 有一辆车想从图的一个地方到达另外一个地方,每个 ...
- poj 1144 Network 【求一个网络的割点的个数 矩阵建图+模板应用】
题目地址:http://poj.org/problem?id=1144 题目:输入一个n,代表有n个节点(如果n==0就结束程序运行). 在当下n的这一组数据,可能会有若干行数据,每行先输入一个节点a ...
- 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 ...
- POJ 3463 有向图求次短路的长度及其方法数
题目大意: 希望求出走出最短路的方法总数,如果次短路只比最短路小1,那也是可取的 输出总的方法数 这里n个点,每个点有最短和次短两种长度 这里采取的是dijkstra的思想,相当于我们可以不断找到更新 ...
- poj 3463 Sightseeing( 最短路与次短路)
http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- HDU 1688 Sightseeing 【输出最短路+次短路条数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题目大意:给n个点,m条有向边.再给出起点s, 终点t.求出s到t的最短路条数+次短路条数. 思 ...
- POJ - 3463 Sightseeing 最短路计数+次短路计数
F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...
- poj 3463 Sightseeing——次短路计数
题目:http://poj.org/problem?id=3463 当然要给一个点记最短路和次短路的长度和方案. 但往优先队列里放的结构体和vis竟然也要区分0/1,就像把一个点拆成两个点了一样. 不 ...
- POJ 3463 Sightseeing (次短路)
题意:求两点之间最短路的数目加上比最短路长度大1的路径数目 分析:可以转化为求最短路和次短路的问题,如果次短路比最短路大1,那么结果就是最短路数目加上次短路数目,否则就不加. 求解次短路的过程也是基于 ...
随机推荐
- PAT 1012 数字分类 (20)(代码+测试点)
1012 数字分类 (20)(20 分) 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求 ...
- sqrt函数倒数计算新对比
某人发表说 雷神之锤 里面有一个 1/sqrt(x) 的函数非常了不起. 但经过实测,发现现在计算机已经优化, 该算法已经没有优势. 具体看文档: <a href="http://fi ...
- TortoiseSVN Project Monitor使用
今天下载了TortoiseSVN Project Monitor,要把一个项目导入 name一直没有输入,一直导入不成功,点击了ok也不给提示,切记要写项目Name啊! 在使用svncheckout时 ...
- sleep()方法和yield()方法有什么区别?
两者都是Thread类的静态方法,定义如下 public static void sleep(long millis) throws InterruptedException public stati ...
- ArrayList、Vector、LinkedList的特点和区别
ArrayList.Vector.LinkedList类均在java.util包中,均为可伸缩数组. 1)ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会 ...
- How to reconfigure installed dpkg package (tzdata, locales)
1 List the installed dpkg package $ sudo dpkg --list 2 Reconfigure the package $ sudo dpkg-reconfigu ...
- SQL Server 查询中文字段返回为空
昨晚维护系统数据时,遇到个奇怪现象.明明数据库里有数据,查询结果就是返回为空.具体情况是这样的,查询工作日志表里关于工作描述的情况,以中文内容匹配工作描述字段,其中匹配内容里包含有空格. 尝试去掉第一 ...
- centos 6.5 配置ssh免登录
生成密匙: ssh-keygen -t rsa 会生成 id_rsa id_rsa.pub id_rsa:私匙 id_rsa.pub:公匙 配置当前机器免登录: cp id_rsa.pub auth ...
- java mail 读取邮件列表,
// 准备连接服务器的会话信息 Properties props = new Properties(); props.setProperty("mail.store.protocol&quo ...
- rbtposeekf的注意事项
1.发布的odom topic以及 imu topic必须加上协方差部分:2.在发布odom的时候,去掉里面的odom->base_link的tf,因为这个tf会在robot_pose_ekf包 ...