题目大意

给出一个有向图(可能存在重边),求从\(S\)到\(F\)最短路的条数,如果次短路的长度仅比最短路的长度多1,那么再加上次短路的条数。

输入格式

第一行是数据组数\(T\)。

对于魅族数据,第一行是\(n\)和\(m\),表示节点数和边数。

接下来\(m\)行,每行三个整数\(a\),\(b\),\(l\),表示\(a\rightarrow b\)有一条边,长度为\(l\)。

最后两个整数表示\(S\)和\(F\)。

输出格式

对于每组数据输出一个答案\(ans\)。

数据范围

\(2\le n\le 1000,1\le m\le 10000,1\le a,b\le n,1\le l\le 1000,1\le ans\le 10^9\)

样例

2

5 8

1 2 3

1 3 2

1 4 5

2 3 1

2 5 3

3 4 2

3 5 4

4 5 3

1 5

5 6

2 3 1

3 2 1

3 1 10

4 5 2

5 2 7

5 2 7

4 13

样例输出

3

2

思路

用Dijkstra更新时分四种情况:

  • 新路径比最短路径长度要小,最短路和次短路的长度和次数都要更新。
  • 新路径等于最短路的长度,更新最短路的条数。
  • 新路径比最短路要长但是比次短路要短,更新次短路的长度和条数。
  • 新路径等于次短路径的长度,更新次短路径的条数。

代码

#include<stdio.h>
#include<string.h>
const int maxn=1010;
const int maxm=10010;
const int INF=0x3f3f3f3f;
int g[maxn][maxn],dis[maxn][2],cnt[maxn][2];
bool vis[maxn][2];
int n,m; struct Edge{
int v,w,to;
} edge[maxm]; int num,head[maxn];
void add(int u,int v,int w){
edge[num].v=v;
edge[num].w=w;
edge[num].to=head[u];
head[u]=num++;
} void dij(int s){
int now,min,k; for(int i=1; i<=n; i++){
dis[i][0]=INF;
dis[i][1]=INF;
} memset(vis,false,sizeof(vis));
cnt[s][0]=1;
dis[s][0]=0;
for(int i=1; i<2*n; i++){
now=-1;
min=INF;
for(int j=1; j<=n; j++)
if(!vis[j][0]&&min>dis[j][0]){
k=0;
min=dis[j][0];
now=j;
}
else if(!vis[j][1]&&min>dis[j][1]){
k=1;
min=dis[j][1];
now=j;
}
if(now==-1)break;
vis[now][k]=1; for(int j=head[now]; j!=-1; j=edge[j].to){
int v=edge[j].v;
int len=dis[now][k]+edge[j].w;
if(len<dis[v][0]){
dis[v][1]=dis[v][0];
cnt[v][1]=cnt[v][0];
dis[v][0]=len;
cnt[v][0]=cnt[now][k];
}else if(len==dis[v][0]){
cnt[v][0]+=cnt[now][k];
}else if(len<dis[v][1]){
dis[v][1]=len;
cnt[v][1]=cnt[now][k];
}else if(len==dis[v][1])
cnt[v][1]+=cnt[now][k];
}
}
} int main(){
int T;
scanf("%d",&T);
while(T--){
num=0;
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m); int a,b,c,s,f;
for(int i=1; i<=m; i++){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
} scanf("%d%d",&s,&f);
dij(s);
int ans=cnt[f][0];
if(dis[f][1]==dis[f][0]+1)
ans+=cnt[f][1];
printf("%d\n",ans);
}
}

【最短路】HDU 1688 Sightseeing的更多相关文章

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

  2. HDU 1688 Sightseeing

    题目链接:Sightseeing 题意:求最短路和比最短路长度+1的所有路径条数. 附代码:用数组记录最短和次短路径的长度和条数,一次更新,直到没有边可以更新. #include <stdio. ...

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

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

  4. hdu 1688 Sightseeing (最短路径)

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

  5. poj 3463/hdu 1688 求次短路和最短路个数

    http://poj.org/problem?id=3463 http://acm.hdu.edu.cn/showproblem.php?pid=1688 求出最短路的条数比最短路大1的次短路的条数和 ...

  6. BFS(最短路) HDU 2612 Find a way

    题目传送门 /* BFS:和UVA_11624差不多,本题就是分别求两个点到KFC的最短路,然后相加求最小值 */ /***************************************** ...

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

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

  8. 【HDOJ】1688 Sightseeing

    Dijkstra求解次短路径,使用cnt和dis数组记录最小.次小的个数和长度.重写更新操作. /* 1688 */ #include <iostream> #include <st ...

  9. 最短路 HDU 2544

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. IDEA左侧文件目录不见了,帮你找回来!

    前几天不知道什么操作,把IDEA左侧项目的目录给弄没了,如下图,在百度上搜索了不少,就是没有效果,很是头疼,巧的是,今天琢磨了一下,又给弄回来了,所以在此记录一下,以后再给弄没了,就知道了,同时也算是 ...

  2. JQuery的Ajax实现注册检测用户名

    Ajax(无需等待直接向服务器发起请求) (Asynchronous Javascript And Xml) :异步的 Google创新的一种js技术 实现方法一:比较原始没有封装的方法: //核对用 ...

  3. django.db.utils.InternalError: (1091, "Can't DROP 'cre_time'; check that column/key exists")

    在执行命令python manage.py migrate时报错:django.db.utils.InternalError: (1091, “Can’t DROP ‘cre_time’; check ...

  4. oracle之同义词

    同义词 从字面上理解就是别名的意思,和视图的功能类似.就是一种映射关系. 14.1 私有同义词; 一般是普通用户自己建立的同义词,创建者需要create synonym 权限. sys:SQL> ...

  5. Java文件操作API功能与Windows DOS命令和Linux Shell 命令类比

    Java文件操作API功能与Windows DOS命令和Linux Shell 命令类比: Unix/Linux (Bash) Windows(MS-DOS) Java 进入目录 cd cd - 创建 ...

  6. [GXYCTF2019]禁止套娃 1 &无参数RCE

    [GXYCTF2019]禁止套娃 1 啥都没有那只能上扫描器来一探究竟了. 扫完没有啥结果,但网上找了一下说是git泄露,但是我这里显示了403. <?php include "fla ...

  7. 关于button和submit的form提交以及 页面跳转问题

    最近在做官网的注册登录form提交时遇到了这个问题,1.0时因为使用普通的模板并没有出现页面跳转失败问题 由于2.0时更换了注册模板,此时按钮样式是以下样式 而在css样式的模板里使用的是button ...

  8. [视频]iNeuOS 自主可控工业互联网一体化解决方案 整体介绍

    演示地址:http://demo.ineuos.net  (注:自己注册) iNeuOS 自主可控工业互联网操作系统,提供全新解决方案 核心组件包括:边缘网关(iNeuLink).设备容器(iNeuK ...

  9. Word rings

    Word rings 题目描述 这道题就是想求出所有的环,然后在所有环中比较出环串的平均长度最长的那一个,然后就输出平均长度最长的,如果在一个点当中的样例中没有环的话我们就应该输出"No S ...

  10. What number should I guess next ?——由《鹰蛋》一题引发的思考

    What number should I guess next ? 这篇文章的灵感来源于最近技术部的团建与著名的DP优化<鹰蛋>.记得在一个月前,查到鹰蛋的题解前,我在与同学讨论时,一直试 ...