题意

求出最短路和次短路的条数,当次短路比最短路长度小1时,输出条数之和,反之输出最短路条数。

题解

 dis1[],cnt1[],dis2[],cnt2[] 分别表示最短路的长度和条数,次短路的长度和条数。
 当当前距离小于当前点最短路长度的时候,更新二者长度和条数。
 当当前距离等于当前点最短路长度的时候,更新最短路条数。
 当当前距离小于当前点次短路长度的时候,更新次短路的长度和条数。
 当当前距离等于当前点次短路长度的时候,更新次短路的条数。

 push进队列的时候要标注push进去的是最短路还是次短路。

C++代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define endl "\n" typedef long long ll;
const int maxn = 1e5 + ;
const int INF = << ; struct edge{
int to ,nxt,w;
}e[maxn]; int n , m ; int vis[maxn][];
int d[maxn][],dp[maxn][];
int head[maxn],cnt; void init(){
cnt = ;
memset(head,-,sizeof head);
} void add_edge(int u,int v,int w){
e[cnt].to = v;
e[cnt].nxt = head[u];
e[cnt].w = w;
head[u] = cnt++;
} void dijstra(int s, int ee){
for(int i = ;i <= n ; i++)
d[i][] = d[i][] = INF;
memset(vis,,sizeof vis);
memset(dp,,sizeof dp);
d[s][] = ;
dp[s][] = ;
while(){
int maxn = INF;
int v ,flag;
for(int j = ;j <= n ;j ++){
if(!vis[j][] && maxn > d[j][]){
maxn = d[j][];
v = j;
flag = ;
}
else if(!vis[j][] && maxn > d[j][]){
maxn = d[j][];
v = j;
flag = ;
}
}
if(v == ee && flag == ) break;
if(maxn == INF) break;
vis[v][flag] = ;
for(int u = head[v]; ~u; u = e[u].nxt){
int j = e[u].to,w = e[u].w;
if(!vis[j][] && d[v][flag] + w < d[j][]){
d[j][] = d[j][];
d[j][] = d[v][flag] + w;
dp[j][] = dp[j][];
dp[j][] = dp[v][flag];
}else if(!vis[j][] && d[v][flag] + w == d[j][]){
dp[j][] += dp[v][flag] ;
}else if(!vis[j][] && d[v][flag] + w < d[j][]){
d[j][] = d[v][flag] + w;
dp[j][] = dp[v][flag];
}else if(!vis[j][] && d[v][flag] + w == d[j][])
dp[j][] += dp[v][flag];
//cout << dp[j][1] << " " << dp[j][0] << endl;
}
}
} int main(){
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int s ,ee ,t;
int x, y , w;
cin >> t;
while(t--){
cin >> n >> m;
init();
for(int i = ;i < m ; i++){
cin >> x >> y >> w;
add_edge(x,y,w);
}
cin >> s >> ee;
dijstra(s,ee);
if(d[ee][] + == d[ee][])
cout << dp[ee][] + dp[ee][] << endl;
else
cout << dp[ee][] << endl;
}
return ;
}

HDU1688-POJ3463-Sightseeing(求次短路的条数)的更多相关文章

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

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

  2. [POJ3463] Sightseeing(次短路 Heap + Dijkstra)

    传送门 用dijkstra比较好,spfa可能有的重复 dis[x][2]:dis[x][0]表示起点到x的最短路.dis[x][1]表示起点到x的次短路: tot[x][2]:tot[x][0]表示 ...

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

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

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

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

  5. Sightseeing(dijlstar) 计算最短路和次短路的条数

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10004   Accepted: 3523 Desc ...

  6. SUSTOJ_路痴的单身小涵(图中最短路的条数)

    去年因为太low没有做出来校赛的最后一题,遂今年校赛做了这个题,下面我做详细描述. 原题链接 本题大意:给定一个无向图G,每个边的权值为1,图中L表示起点,C表示终点,#表示未通路,给定时间k,让你判 ...

  7. hdu3191+hdu1688(求最短路和次短路条数,模板)

    hdu3191题意:求出次短路的长度和条数 #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  8. 【Dijkstra+邻接表求次短路】POJ Sightseeing 3463

    Language: Default Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7766   Ac ...

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

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

随机推荐

  1. UVa 572 Oil Deposits (Floodfill && DFS)

    题意 :输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横竖以及对角方向),就是说它们属于同一个八连块. 分析 :可以考虑种子填充深搜的方法.两重for循 ...

  2. Android中播放声音

    在Android系统中,有两种播放声音的方式,一种是通过MediaPlayer,另外一种是通过SoundPool.前者主要用于播放长时间的音乐,而后者用于播放小段小段的音效,像按键音这种,其优点是资源 ...

  3. Codeforces Round #403---C题(DFS,树)

    C. Andryusha and Colored Balloons time limit per test 2 seconds memory limit per test 256 megabytes ...

  4. Spark 2.1.1 源码编译

    Spark 2.1.1 源码编译 标签(空格分隔): Spark Spark 源码编译 环境准备与起因 由于线上Spark On Yarn Spark Streaming程序在消费kafka 写入HD ...

  5. 大哥带的Orchel数据库时间盲注

    0X01Oracle基于延时的盲注总结 0x00 前言 oracle注入中可以通过页面响应的状态,这里指的是响应时间,通过这种方式判断SQL是否被执行的方式,便是时间盲注: oracle的时间盲注通常 ...

  6. NOIP2002-字串变换【双向BFS】

    NOIP2002-字串变换 Description 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A_2A2​ -> B_2B2​ 规 ...

  7. [BZOJ2729]:[HNOI2012]排队(组合数学)

    题目传送门 题目描述 某中学有n名男同学,m名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) ...

  8. GIT的安装和配置

  9. linux查看端口被那个进程占用

    linux下遇到端口被暂用了 需要知道是哪个进程 比如80端口 可以这样 netstat -tunlp|

  10. Python深度学习读书笔记-2.初识神经网络

    MNIST 数据集 包含60 000 张训练图像和10 000 张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即 ...