POJ 3463 && HDU 1688 Sightseeing 次短路
来源:互联网 发布:网络黑彩怎么打击 编辑:程序博客网 时间:2024/05/09 09:46
这道题就是给出有向图和起点s重点t,求出s到t的次短路个数+最短路个数,注意,次短路总和如果比最短路总和+1要大的话,就只要算最短路个数。
由于不难, 所以直接上代码。
#include <iostream>#include <cstdio>#include <queue>using namespace std ;const int maxn = 1010, maxm = 10010 ;const int zhf = 1000000000 ;inline void Read ( int &x ) { // 养成读入输出优化的习惯了。。。。 char c = getchar() ; bool f = 0 ; x = 0 ; while ( !isdigit(c) ) { if ( c == '-' ) f = 1 ; c = getchar() ; } while ( isdigit(c) ) { x = 10 * x + c - '0' ; c = getchar() ; } if (f) x = -x ;}inline void Print ( int x ) { int len = 0 , s[20] = {0} ; if ( x == 0 ) { putchar('0') ; return ; } if ( x < 0 ) { x = -x ; putchar('-') ; } while (x) { s[++len] = x % 10 ; x /= 10 ; } while (len) putchar ( s[len--] + '0' ) ;}int to[maxm], e, n, m, be[maxn], nxt[maxm], w[maxm], d[maxn][2], cnt[maxn][2] ;bool vis[maxn][2] ;//后面的[2],[0]表示最短路中,[1]表示次短路中void add ( int x, int y, int z ) { to[++e] = y ; nxt[e] = be[x] ; be[x] = e ; w[e] = z ;}//链式前向星void init() { int i ; e = 0 ; for ( i = 0 ; i < maxn ; i ++ ) to[i] = be[i] = nxt[i] = w[i] = vis[i][0] = vis[i][1] = cnt[i][1] = cnt[i][0] = 0, d[i][1] = d[i][0] = zhf ; for ( i = maxn ; i < maxm ; i ++ ) to[i] = nxt[i] = w[i] = 0 ;}//初始化int dijkstra ( int st, int end ) { int i, j, k ; // Kind d[st][0] = 0 ; cnt[st][0] = 1 ; for ( i = 1 ; i <= n << 1 ; i ++ ) { int minn = zhf , u = -1 ; for ( j = 1 ; j <= n ; j ++ ) for ( int flag = 0 ; flag <= 1 ; flag ++ ) if ( !vis[j][flag] && d[j][flag] < minn ) { u = j ; minn = d[j][flag] ; k = flag ; } if ( u == -1 ) break ; vis[u][k] = 1 ; for ( j = be[u] ; j ; j = nxt[j] ) { int v = to[j] ; int wei = d[u][k] + w[j] ; if ( wei < d[v][0] ) { // 更新最短路 d[v][1] = d[v][0] ; cnt[v][1] = cnt[v][0] ; d[v][0] = wei ; cnt[v][0] = cnt[u][k] ; } else if ( wei == d[v][0] ) { //等于最短路 cnt[v][0] += cnt[u][k] ; } else if ( wei < d[v][1] ) { //更新次短路 d[v][1] = wei ; cnt[v][1] = cnt[u][k] ; } else if ( wei == d[v][1] ) //等于次短路 cnt[v][1] += cnt[u][k] ; } } int res = cnt[end][0] ; if ( d[end][1] - 1 == d[end][0] ) //是否需要加入次短路数量 res += cnt[end][1] ; return res ;}int main () { int i, j, k, st, end, x, y, z, t ; Read(t) ; while ( t -- ) { init() ; Read(n) ; Read(m) ; for ( i = 1 ; i <= m ; i ++ ) { Read(x) ; Read(y) ; Read(z) ; add ( x, y, z ) ; //有向图 } Read(st) ; Read (end) ; Print ( dijkstra( st, end ) ) ; putchar('\n'); } return 0 ;}
0 0
- POJ 3463 && HDU 1688 Sightseeing 次短路
- POJ 3463 Sightseeing 次短路
- POJ 3463 Sightseeing 最短路+次短路
- HDU-1688 Sightseeing(最短路+次短路)
- POJ 3463 Sightseeing 次短路条数
- POJ 3463 Sightseeing (次短路,Dijkstra拓展)
- poj 3463 Sightseeing (次短路 )
- poj-3463-Sightseeing-求次短路
- HDU 1688 Sightseeing 【次短路条数】
- poj 3463 Sightseeing(最短路+次短路)
- poj 3463 Sightseeing(最短路&&次短路)
- poj 3463 Sightseeing(最短路和次短路)
- poj 3463 Sightseeing(最短路次短路)
- POJ-3463: Sightseeing 【最短路次短路及条数】
- POJ 3463 Sightseeing(最短路次短路计数)
- POJ --- 3463 Sightseeing 【次短路 + 最短路 + Dij】
- poj 3463 Sightseeing 最短路和次短路计数
- HDU-1688 Sightseeing 最短路与“次短路”条数
- PAT 乙级 1004
- websphere 配置虚拟目录
- android 主线程和子线程之间的消息传递
- 赛马网基本算法之--研究生考试
- WebView.loadData图片适配
- POJ 3463 && HDU 1688 Sightseeing 次短路
- 变量重难点
- 智能IoT系统框架理论
- 基于邻接矩阵的Dijkstra和基于优先队列的Dijkstra算法
- Hbase 统计表行数的3种方式总结
- NYOJ - 1058 - 部分和问题(DFS+减枝)
- 匈牙利算法
- Python正则表达式
- HDU4255【BFS】