题目链接: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 ;
}

最新文章

  1. selenium结合最新版的sikuli使用
  2. asp.net mvc 之旅—— 第四站 学会用Reflector调试我们的MVC框架代码
  3. Drupal资源
  4. Math-基本功能
  5. LeetCode() Min Stack 不知道哪里不对,留待。
  6. [Javascrip] Logging Timing Data to the Console
  7. CSS+DIV入门第一天基础视频 CSS选择器层叠性和继承性
  8. 17.4.3 使用MulticastSocket实现多点广播(3)
  9. .Net Core在Ubuntu上操作MySql折腾实录
  10. 这是我对GET与POST的区别的回答
  11. Event filter with query &quot;SELECT * FROM __InstanceModi
  12. 【学习总结】GirlsInAI ML-diary day-14-function函数
  13. java远程文件操作
  14. Decoders Matter for Semantic Segmentation:Data-Dependent Decoding Enables Flexible Feature Aggregation
  15. 关于session,cookie,Cache
  16. Manjaro 玩机记录
  17. PAT 甲级 1045 Favorite Color Stripe
  18. P4147 玉蟾宫
  19. 【Tomcat】Tomcat 系统架构与设计模式,第 1 部分: 工作原理
  20. for-each、for-in和for-of的区别

热门文章

  1. 【linux】如何查看进程运行在那颗cpu上
  2. Linux内核同步【转】
  3. android的GPS代码分析JNI如何HAL之间如何设置回调函数【转】
  4. Could not find JSON in http://updates.jenkins-ci.org/update-center.json?id=default&amp;version=2.7.4
  5. linux 下监控进程流量情况命令 NetHogs
  6. POJ 3744 Scout YYF I:概率dp
  7. Go丨语言学习笔记--switch
  8. array_2.array_rand
  9. codeforces 610D D. Vika and Segments(离散化+线段树+扫描线算法)
  10. PHP 正则表达示