HDU-1688-Sightseeing
来源:互联网 发布:matlab 矩阵元素赋值 编辑:程序博客网 时间:2024/06/05 06:39
ACM模版
描述
题解
第k短路,这里要求的是第1短路(即最短路),第2短路(即次短路),以及路径条数,最后如果最短路和次短路长度差1,则输出两种路径条数之和,否则只输出最短路条数。
第一次做次短路问题,很有趣哦~~~
代码
#include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <vector>#include <cstdio>using namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 1010;struct Edge{ int to, w;};struct node{ int v, dist; int tag; bool friend operator < (const node &a, const node &b) { if (a.dist != b.dist) { return a.dist > b.dist; } return a.v > b.v; }};priority_queue<node> Q;vector<Edge> graph[MAXN];int cnt[MAXN][3]; // cnt[v][1]存储最短路径数,cnt[v][2]存储次短路径数int vis[MAXN][3]; // 同理,vis存状态int dis[MAXN][3]; // dis[v][1]存储最短,dis[v][2]存储次短int N, M, A, B, L;void init(){ for (int i = 0; i < MAXN; i++) { cnt[i][1] = cnt[i][2] = 0; vis[i][1] = vis[i][2] = 0; dis[i][1] = dis[i][2] = INF; }}void Dijstra(int st, int ed){ dis[st][1] = 0; cnt[st][1] = 1; node q, p; p.dist = 0; p.tag = 1; p.v = st; Q.push(p); while (!Q.empty()) { q = Q.top(); Q.pop(); if (vis[q.v][q.tag]) { continue; } vis[q.v][q.tag] = 1; for (int i = 0; i < graph[q.v].size(); i++) { int v = graph[q.v][i].to; int w = graph[q.v][i].w; // 找到一条比“最短”更短的路 if (!vis[v][1] && dis[v][1] > q.dist + w) { // 把“最短“变为”次短“ if (dis[v][1] != INF) { dis[v][2] = dis[v][1]; cnt[v][2] = cnt[v][1]; p.dist = dis[v][2]; p.tag = 2; p.v = v; Q.push(p); } // 更新”最短“ dis[v][1] = q.dist + w; cnt[v][1] = cnt[q.v][q.tag]; p.tag = 1; p.dist = dis[v][1]; p.v = v; Q.push(p); } // 找到一条”最短“,更新”最短条数“ else if (!vis[v][1] && dis[v][1] == q.dist + w) { cnt[v][1] += cnt[q.v][q.tag]; } // 找到一条比”最短“长,比”次短“短的路,更新”次短“ else if (!vis[v][2] && dis[v][2] > q.dist + w) { dis[v][2] = q.dist + w; cnt[v][2] = cnt[q.v][q.tag]; p.tag = 2; p.dist = dis[v][2]; p.v = v; Q.push(p); } // 找到一条”次短“,更新”次短条数“ else if (!vis[v][2] && dis[v][2] == q.dist + w) { cnt[v][2] += cnt[q.v][q.tag]; } } }}int main(){ int T; scanf("%d", &T); Edge temp; int st, ed; while (T--) { init(); for (int i = 0; i < MAXN; i++) { graph[i].clear(); } scanf("%d%d", &N, &M); for (int i = 0; i < M; i++) { scanf("%d%d%d", &A, &B, &L); temp.to = B; temp.w = L; graph[A].push_back(temp); } scanf("%d%d", &st, &ed); Dijstra(st, ed); if (dis[ed][1] + 1 == dis[ed][2]) { printf("%d\n", cnt[ed][1] + cnt[ed][2]); } else { printf("%d\n", cnt[ed][1]); } } return 0;}
参考
《第K短路》
0 0
- HDU 1688 Sightseeing
- hdu 1688 Sightseeing
- HDU-1688-Sightseeing
- HDU 1688 Sightseeing
- hdu 1688 Sightseeing
- HDU 1688 Sightseeing 【次短路条数】
- POJ 3463 && HDU 1688 Sightseeing 次短路
- HDU-1688 Sightseeing(最短路+次短路)
- HDU-1688 Sightseeing 最短路与“次短路”条数
- hdu 1688 Sightseeing【最短路,次短路条数】
- hdu 1688 Sightseeing(最短路+次短路条数)
- Sightseeing
- Sightseeing
- HDU 1688 Sightseeing 求最短路和次短路条数之和
- HDU 1688 Sightseeing 最短路 及次短路 路径长度和路径数
- hdu 1956 || poj 1637 Sightseeing tour (混合图欧拉回路)
- HDU 1599 find the mincost route 、 poj 1734 Sightseeing trip
- hdu 1956 Sightseeing tour(混合图欧拉回路)
- Spring boot学习笔记 004
- java.sql.SQLException: No suitable driver found for jdbc:mysql
- 第二类曲面积分
- Leetcode在线编程single-number-ii
- Servlet的使用
- HDU-1688-Sightseeing
- 6. Your dev and test sets should come from the same distribution 你的开发集和测试集应该来自同一分布(《MACHINE LEARNING
- android中的SVG图像的各个属性意义
- 中国电科院招渗透测试工程师和逆向分析工程师
- 北航第十二届程序设计竞赛网络预赛题解
- Nth to Last Node in List
- Recover Rotated Sorted Array
- 7. How large do the dev/test sets need to be? 开发集和测试集多大合适(《MACHINE LEARNING YEARNING》翻译)
- JsonPath的使用