题目链接: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. myeclipse安装tomactserver图解

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/shaozucheng/article/details/36673227 选择标题栏中 Window- ...

  2. PermissionError: [Errno 13] Permission denied:

    在ubuntu系统下使用pip 命令安装包时,出现以下类似错误提示: PermissionError: [Errno 13] Permission denied: '/usr/local/lib/py ...

  3. ORACEL 常用命令

    ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 代码如下: --锁表查询SQL ...

  4. Java多线程系列 基础篇04 线程中断

    1. 中断线程 中断可以理解为线程的一个标志位属性,它表示一个运行中的线程是否被其他线程进行了中断操作,其他线程通过调用该线程的interrupt()方法对其进行中断操作,线程通过检查自身是否被中断来 ...

  5. Spring当中的名称装配和类型装配有什么区别?

    6 人赞同了该回答 Spring auto-wire的 五种方式:1:no 默认的方式是不进行自动装配,通过手工设置ref 属性来进行装配bean2:byName 通过参数名 自动装配,如果一个bea ...

  6. freemaker开发

    推荐书籍 百度云盘 密码: c3m9 1. 前言 本书为<FreeMarker 2.3.19 中文版手册>,包含了freemarker开发得方方面面,可以作为开发freemarker的字典 ...

  7. matlab之scatter3()函数

    Display point cloud in scatter plot(在散点图中显示点云): scatter3(X,Y,Z) 在向量 X.Y 和 Z 指定的位置显示圆圈. scatter3(X,Y, ...

  8. Cocos2d-x中定时器的使用

    CCTimer:轻量级的计时器 CCTimer (void) ccTime  getInterval (void) void  setInterval (ccTime fInterval) bool  ...

  9. centos7搭建mysql-5.7.22主从复制

    mysql7.7.22主从复制 本项目是根据真实环境搭建编写出文档,文档中的目录也是根据自己公司环境所创建.公司原来是一台服务器搭建的数据库(5.7.22),由于业务的扩展需要搭建一台从服务器,减轻主 ...

  10. linux 下文件恢复工具extundelete介绍

        下载 http://extundelete.sourceforge.net/ bunzip2 extundelete-0.2.0.tar.bz2 tar xvf extundelete-0.2 ...