poj3463 最短路和次短路 計數

2022-03-21 02:35:20 字數 1606 閱讀 4563

這道題就是讓你求出有向圖中最短路和比最短路長1的路的數量, 我們求出次短路和最短路的數量即可解決這道題

/*

求s到t的最短路與次短路(這裡要求只比最短路多1)的條數之和

聯想到最小,次小的一種更新關係:

if(x《最小)更新最小,次小

else if(==最小)更新方法數

else if(x《次小)更新次小

else if(x==次小)更新方法數

同時記錄s到u最短,次短路及方法數

用乙個堆每次取最小的,更新完後再入堆

還是那個原理,第一次遇到的就是最優的,然後vi標記為真

方法數注意是加法原理,不是乘法

\ -- u -- v 所以是加法原理

/ */

**如下:

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn = 1000 + 10

;const

int inf = 0x3f3f3f3f

;int

n, m;

struct edge ;

vector

g[maxn];

ints, f;

struct

dij};

int dist[maxn][2], vis[maxn][2], dp[maxn][2

];void

dijkstra()

);

while(!que.empty()));}

dist[v][

0] =w;

dp[v][

0] =dp[u][flog];

que.push((dij));

}else

if(w == dist[v][0]) //

更新方法數

dp[v][0] +=dp[u][flog];

else

if(w < dist[v][1]) //

更新次短路

); }

else

if(w == dist[v][1]) //

更新方法數

dp[v][1] +=dp[u][flog];}}

}int

main()

);

//g[v].push_back((edge));

} scanf(

"%d%d

", &s, &f);

dijkstra();

if(dist[f][1]-dist[f][0] == 1

) printf(

"%d\n

", dp[f][0]+dp[f][1

]);

else

printf(

"%d\n

", dp[f][0

]); }

return0;

}

POJ 3463 最短路 次短路

本題是求最短路和比最短路距離長1的次短路的個數,於是就用到了dijkstra 主要的改變就是陣列都開到了二維,第二維用來表示是最短路還是次短路 比如d陣列和vis陣列 而cnt陣列使用來訪問最短路和次短路的次數 那麼最外層的迴圈就要到2 n 1次了,其中n 1次是用來求最短路的,還有n次是次短路的 ...

POJ 最短路徑

這兩天做了六道最短路徑的問題,分別用了dijkstra演算法 spfa演算法和floyd演算法,甚至還有一道題用並查集做的也a了,感覺對短路徑已經學得很不錯了。poj1860,poj3259,poj1062,poj2253,poj1125,poj2240 poj2253,dijkstra和並查集都可...

最短路與次短路計數

poj 3464 問最短路的條數 比最短路權值大 1 的條數 做法 比較一下次短路和最短路的值 若次短路恰好比最短路大1,答案為最短路 次短路條數,否則答案就是最短路條數 1 include2 const int inf 0x3f3f3f3f 3 class count short path e m...