【最短路】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 ...
随机推荐
- CentOS7 中常用命令
1.开放端口 开放50070端口 firewall-cmd --zone=public --add-port=50070/tcp --permanent 关闭50070端口 firewall-cmd ...
- Fliptile(POJ 3279)
原题如下: Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16494 Accepted: 6025 D ...
- vmware启动winodws时报错弹出【无法连接MKS:套接字连接尝试次数太多;正在放弃;】
启动虚拟机时报错 解决办法:(其实就是有关于虚拟机的服务没有起) win+R输入services.msc,将所有有关vmware的服务都起起来即可
- [Leetcode]Sql系列3
题目1 产品数据表: Products +---------------+---------+ | Column Name | Type | +---------------+---------+ | ...
- Linux里隐藏的计算器,你知道它的奥秘吗?
Linux里隐藏的计算器,你知道它的奥秘吗? 大家都知道,windows下有个计算器工具,我们在工作生活中经常使用到它.但是,你可知Linux下也同样有个计算器吗? 当然,良许说的是命令行下的计算器工 ...
- 时不时刷刷BOSS 看看技术需求
5.熟悉Java,熟悉spring,rose等常见的web开发框架优先. 岗位要求:1. 大学本科及以上学历,计算机软件相关专业毕业:2. 3年及以上Java及Web系统设计和开发经验:3. 扎实的数 ...
- day56:django:csrf_token&文件上传
目录 1.csrf介绍 2.django实现csrf_token认证 3.django实现文件上传 csrf介绍 什么是csrf? csrf:跨站请求伪造.攻击者通过HTTP请求将数据传送到服务器,从 ...
- 记一次磁盘UUID不能识别故障处理
早上zabbix报警,磁盘满了,登录服务器查看信息,一顿操作,突然发现最后lvextend命令不能扩容,查看LVM信息 报错信息"Couldn't find device with uuid ...
- 使用kind搭建kubernetes
使用kind搭建kubernetes 目录 使用kind搭建kubernetes kind架构 创建集群 将镜像加载到kind的node中 配置kind集群 配置多节点 多控制面 指定Kubernet ...
- python语言概述
python语言的发展 python语言诞生于1990年,由Guide van Rossum设计并领导开发. python语言是开源项目的优秀代表,其解释器的全部代码都是开源的. 编写Hello程序 ...