题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688

题意:第k短路,这里要求的是第1短路(即最短路),第2短路(即次短路),以及路径条数,最后如果最短路和次短路长度差1,则输出两种路径条数之和,否则只输出最短路条数。

思路:dijkstra变形,注意状态的转移,代码上附了注释,就不多说了..

代码:

 #include <bits/stdc++.h>
#define MAXN 1010
using namespace std; vector<pair<int, int> > mp[MAXN]; //***记录图
int dist[MAXN][]; //***记录源点此时到 i 的距离状态即最短路距离和次短路距离
int cnt[MAXN][]; //***记录该点作为最短路节点和次短路节点入队次数
int vis[MAXN][]; //***标记该点的状态即在最短路中,在次短路中,或者未被标记
const int inf=0x3f3f3f3f; struct node{ //***重载比较符使优先队列非升序排列
int point, value, tag;//***point记录点, value记录源点到此点的距离,tag标记次点是在最短路中或者在次短路中
friend bool operator< (node a, node b){
return a.value!=b.value? a.value>b.value : a.point>b.point;
}
}; int dijkstra_heap_k(int s){
priority_queue<node> q;
memset(dist, 0x3f, sizeof(dist));
memset(vis, false, sizeof(vis));
memset(cnt, , sizeof(cnt)); dist[s][]=;
cnt[s][]=;
q.push({s, , }); while(!q.empty()){
node u=q.top();
int point=u.point;
int tag=u.tag;
q.pop();
if(vis[point][tag]){
continue;
}else{
vis[point][tag]=;
}
for(int i=; i<mp[point].size(); i++){
int v=mp[point][i].first;
int cost=mp[point][i].second; //***找到比当前最短路更优的路径
if(!vis[v][]&&dist[v][]>u.value+cost){
// 将之前的最短路变为次短路
if(dist[v][]!=inf){
dist[v][]=dist[v][];
cnt[v][]=cnt[v][];
q.push({v, dist[v][], });
}
//***更新最短路
dist[v][]=u.value+cost;
cnt[v][]=cnt[point][tag];
q.push({v, dist[v][], });
}else if(!vis[v][]&&dist[v][]==u.value+cost){
//***找到一条和当前最短路距离一样的路径,更新最短路数目
cnt[v][]+=cnt[point][tag];
}else if(!vis[v][]&&dist[v][]>u.value+cost){
// 比最短路长,比当前次短路短
dist[v][]=u.value+cost;
cnt[v][]=cnt[point][tag];
q.push({v, dist[v][], });
}else if(!vis[v][]&&dist[v][]==u.value+cost){
// 和当前次短路一样长
cnt[v][]+=cnt[point][tag];
}
}
}
} int main(void){
ios::sync_with_stdio(false), cin.tie(), cout.tie();
int t, n, m;
cin >> t;
while(t--){
cin >> n >> m;
while(m--){
int x, y, z;
cin >> x >> y >> z;
mp[x].push_back({y, z}); //**记录有向图
}
int s, e;
cin >> s >> e;
dijkstra_heap_k(s);
if(dist[e][]+==dist[e][]){
cout << cnt[e][]+cnt[e][] << endl;
}else{
cout << cnt[e][] << endl;
}
for(int i=; i<MAXN; i++){
mp[i].clear();
}
}
return ;
}

hdu1688(dijkstra求最短路和次短路)的更多相关文章

  1. Codeforces 938 D. Buy a Ticket (dijkstra 求多元最短路)

    题目链接:Buy a Ticket 题意: 给出n个点m条边,每个点每条边都有各自的权值,对于每个点i,求一个任意j,使得2×d[i][j] + a[j]最小. 题解: 这题其实就是要我们求任意两点的 ...

  2. 关于dijkstra求最短路(模板)

    嗯....   dijkstra是求最短路的一种算法(废话,思维含量较低,   并且时间复杂度较为稳定,为O(n^2),   但是注意:!!!!         不能处理边权为负的情况(但SPFA可以 ...

  3. Aizu-2249 Road Construction(dijkstra求最短路)

    Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...

  4. ACM - 最短路 - AcWing 849 Dijkstra求最短路 I

    AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...

  5. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  6. 最短路和次短路问题,dijkstra算法

    /*  *题目大意:  *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和;  *  *算法思想:  *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...

  7. BZOJ.2125.最短路(仙人掌 最短路Dijkstra)

    题目链接 多次询问求仙人掌上两点间的最短路径. 如果是在树上,那么求LCA就可以了. 先做着,看看能不能把它弄成树. 把仙人掌看作一个图(实际上就是),求一遍根节点到每个点的最短路dis[i]. 对于 ...

  8. poj 3463 最短路与次短路&&统计个数

    题意:求最短路和比最短路长度多1的次短路的个数 本来想图(有)方(模)便(版)用spfa的,结果妹纸要我看看dijkstra怎么解.... 写了三遍orz Ver1.0:堆优化+邻接表,WA //不能 ...

  9. poj 3463 Sightseeing( 最短路与次短路)

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

随机推荐

  1. 支付宝异步通知notify_url接收不了问题解决(转)

    此处return_url可以成功跳转回网站页面但notify_url却接收不到支付宝的异步通知.已保证notify_url是一个外网可以访问的网址 1.网站用的是ssh框架,当支付宝发通知到我这个ac ...

  2. 详解使用EM算法的半监督学习方法应用于朴素贝叶斯文本分类

    1.前言 对大量需要分类的文本数据进行标记是一项繁琐.耗时的任务,而真实世界中,如互联网上存在大量的未标注的数据,获取这些是容易和廉价的.在下面的内容中,我们介绍使用半监督学习和EM算法,充分结合大量 ...

  3. ubuntu把文件移动到指定的文件夹

    有个文件a.txt在/etc下,想把它移动到/etc/fuck文件夹中 cd /etc/fuck sudo mv a.txt 要移动到的文件夹 没报错就成功了

  4. POJ3294 Life Forms —— 后缀数组 最长公共子串

    题目链接:https://vjudge.net/problem/POJ-3294 Life Forms Time Limit: 5000MS   Memory Limit: 65536K Total ...

  5. haproxy 官方文档查看

    http://cbonte.github.io/haproxy-dconv/1.5/configuration.html#reqrep http://www.ttlsa.com/linux/hapro ...

  6. Redis- 内存数据库Redis之安装部署

    内存数据库Redis之安装部署 Redis是一款非关系型,key-value存储的内存数据库,Redis数据库完全在内存中,使用磁盘仅用于持久性.Redis的速度非常快,每秒能执行约11万集合,每秒约 ...

  7. 安装与设置hexo

    普通用户(非全局)安装nodejs和npm wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh nvm ins ...

  8. 分享知识-快乐自己:微服务的注册与发现(基于Eureka)

    1):微服务架构 服务提供者.服务消费者.服务发现组件这三者之间的关系: 各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息. 服务消费者可从服务发现组件查询服 ...

  9. openfire性能测试

    使用TSung对Jabber服务器openfire进行压力测试 http://blog.csdn.net/spider_zhcl/article/details/6073920 Tsung负载测试Ti ...

  10. ubuntu 安装cuda 成功

    洗洗睡了