【最短路】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 ...
随机推荐
- 添加到web.config文件里的用户自定义翻页控件
<pages> <controls> <add tagPrefix="ucl" tagName="Pager_Backstage" ...
- Linked List 单向链表
Linked List 链表的理解 小结 链表是以节点的方式来储存的 每个节点包括 data域:存放数据,next域:指向下一个节点 如图:发现链表的各个节点不一定是连续储存的 链表分为带头节点的链表 ...
- JS -- 基础语法1
一.document.write() 输出内容 document.write() 可用于直接在网页中输出内容. 方式1:输出内容用""括起,直接输出""号内的内 ...
- 架构设计 | 基于Seata中间件,微服务模式下事务管理
源码地址:GitHub·点这里 || GitEE·点这里 一.Seata简介 1.Seata组件 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用 ...
- sql注入--bool盲注,时间盲注
盲注定义: 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 布尔盲注: 布尔盲注只有true跟false,也就是说它根据你的注入信息 ...
- [LeetCode]394. 字符串解码(栈)
题目 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. ...
- Ubuntu16环境安装和使用NFS
通过NFS服务我们可以方便的读写服务器上的文件,一起来实战Ubuntu16环境安装和使用NFS: 文章概要 本次实战由以下步骤组成: 列举环境信息: 在192.168.119.128安装NFS服务,将 ...
- 聊聊分布式下的WebSocket解决方案
前言 最近王子自己搭建了个项目,项目本身很简单,但是里面有使用WebSocket进行消息提醒的功能,大体情况是这样的. 发布消息者在系统中发送消息,实时的把消息推送给对应的一个部门下的所有人. 这里面 ...
- hw小技巧(转载)
小弟也第一次参加hw,经过5天hw,确实也学到了许多的东西,但就本次分享而言,我分享一些我认为在hw里面值得注意的东西以及一些小技巧 0x01 信息收集 信息收集这个多西当然都是老生常谈了,你收集的东 ...
- 想要搭建个论坛?Guide哥调研了100来个 Java 开源论坛系统,发现这 5 个最好用!
大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 最近有点小忙.但是,由于前几天答应了一位读者自己会推荐一些开源的论坛系统,所以,昨晚就简单地熬了个夜,对比了很多 ...