题目链接: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. (转)三层和mvc

    先说下两者出现的目的:三层是一种为了Project间解除耦合所提出来的简单的分层方式但MVC其实并不是基于Project的分层方式,而是一种解除展示模板与主要访问控制依赖的设计模式(其实全部都是基于U ...

  2. eclipse显示adb is down错误,无法真机调试

    cmd进入adb目录下,运行adb kill-server 和 adb start-server还是不能正常调试时, 在360的网络连接列表中找到占用端口5037的adb.exe,全部关闭,重启ecl ...

  3. 剑指Offer:二叉树打印成多行【23】

    剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.uti ...

  4. 高通MSM8255 GPS 调试分析&&Android系统之Broadcom GPS 移植【转】

    本文转载自:http://blog.csdn.net/gabbzang/article/details/12063031 http://blog.csdn.NET/dwyane_zhang/artic ...

  5. 分享知识-快乐自己:全面解析 java注解实战指南

    请你在看这篇文章时,不要感到枯燥,从头到尾一行行看,代码一行行读,你一定会有所收获的. 问: 为什么学习注解? 学习注解有什么好处? 学完能做什么? 答: 1):能够读懂别人的代码,特别是框架相关的代 ...

  6. Linux_异常_02_WinSCP上传文件时显示Permission denied

    异常现象如下: 二.解决方案 1.设置对应目录权限全开,就可以上传文件到这个目录了 sudo chmod 777 /devloper

  7. Linux下查找进程,kill进程

    1. ps命令用来查找linux运行的进程,常用命令: ps aux | grep 进程名:  eg:ps aux | grep admin 查找admin的进程 或者 ps -ef | grep j ...

  8. Java丨springMVC + Ajax 来进行分页

    javaweb 分页技术 实现的方式有很多种,但是小编在网上问了度娘也问了谷老师,得到的答案让小编我不是很满意,so,还是自己写吧! 在小编的博文中,小编不会上传源码,只会把重要的代码和思路供大家参考 ...

  9. T59

    Working without a break makes you more prone to error. The great drawback to living near a main road ...

  10. Java IO(输入输出)

    1. System.out.System.in System 内部: public final static InputStream in = null; public final static Pr ...