【最短路】HDU 1688 Sightseeing
题目大意
给出一个有向图(可能存在重边),求从\(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的更多相关文章
- 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 ...
- HDU 1688 Sightseeing
题目链接:Sightseeing 题意:求最短路和比最短路长度+1的所有路径条数. 附代码:用数组记录最短和次短路径的长度和条数,一次更新,直到没有边可以更新. #include <stdio. ...
- HDU 1688 Sightseeing 【输出最短路+次短路条数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题目大意:给n个点,m条有向边.再给出起点s, 终点t.求出s到t的最短路条数+次短路条数. 思 ...
- hdu 1688 Sightseeing (最短路径)
Sightseeing Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- poj 3463/hdu 1688 求次短路和最短路个数
http://poj.org/problem?id=3463 http://acm.hdu.edu.cn/showproblem.php?pid=1688 求出最短路的条数比最短路大1的次短路的条数和 ...
- BFS(最短路) HDU 2612 Find a way
题目传送门 /* BFS:和UVA_11624差不多,本题就是分别求两个点到KFC的最短路,然后相加求最小值 */ /***************************************** ...
- 【Dijkstra+邻接表求次短路】POJ Sightseeing 3463
Language: Default Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7766 Ac ...
- 【HDOJ】1688 Sightseeing
Dijkstra求解次短路径,使用cnt和dis数组记录最小.次小的个数和长度.重写更新操作. /* 1688 */ #include <iostream> #include <st ...
- 最短路 HDU 2544
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- touchstart 事件与 click 事件的冲突
const clickEvent = (function() { if ('ontouchstart' in document.documentElement === true) retu ...
- jzoj1497. 景点中心
Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个景点均有若干学生正在参观.这n个景点以自然数1至n编号, ...
- TomcatAJP文件包含漏洞
漏洞概述 2020年2月20日,国家信息安全漏洞共享平台(CNVD)发布关于Apache Tomcat的安全公告,Apache Tomcat文件包含漏洞(CNVD-2020-10487,对应CVE-2 ...
- core的 Linq基本使用,简单模拟数据库多表的左右内连接的测试
1:先看效果: 2:部分代码截图 3:全部代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 n ...
- App网络测试
弱网测试作为健壮性测试的重要部分,对于移动端测试必不可少. 什么样的网络属于弱网? 小于或等于2G速率的都属于弱网,且随着5G的到来,3G网络速率的降低,未来3G也会逐渐划入弱网的行列. 对于弱网的数 ...
- OOD 面向对象面试干货分享| 面向对象设计的SOLID原则
S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. 简写 全拼 中文翻译 SRP The Single Res ...
- Session、Cookie、Token 【浅谈三者之间的那点事】
Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 Cookie 的主要目的 ...
- .net core中的那些常用的日志框架(Logging篇)
前言 日志,在我们每个项目中是必不可少的,它不仅能在调试的时候测试数据,而且在项目上线,也是我们排查错误的得力助手,那我就能谈谈,用的多的几个日志框架吧!如果有不对的地方,欢迎来指教错误,谢谢! As ...
- Kafka索引设计的亮点
前言 其实这篇文章只是从Kafka索引入手,来讲述算法在工程上基于场景的灵活运用.单单是因为看源码的时候有感而写之. 索引的重要性 索引对于我们来说并不陌生,每一本书籍的目录就是索引在现实生活中的应用 ...
- Spring Environment对象获取属性
String[] activeProfiles = env.getActiveProfiles();//获取当前是启用哪一个个配置文件 System.out.println(Arrays.toStri ...