HDU 2433 Travel 最短路應用

2021-07-03 04:50:29 字數 853 閱讀 1694

題意:有n個點,m條邊,求依次刪除每一條邊後所有兩點之間的最短路徑的和。

思路:先以每乙個頂點為源點求一遍最短路,這樣就形成了n個最短路樹,第i個樹的邊權和為sum[i]。然後列舉刪除每乙個邊,分別以邊上兩點u、v為源點求最短路,如果u、v的距離發生變化,則以u為源點時,v節點下的子樹的dis[i]都會變化,因邊是雙向的,i到u的距離也一樣會發生改變(以v為源點時情況是一樣的)。那麼,以u、v為源點求最短路後生成樹的邊權和分別為num1和num2,總和的變化量為2×(num1 + num2) - 2×(sum[u] + sum[v]) - 2×(dis[u] - 1) 【因為u到v的邊在之前算了4次,本來算2次就夠了】

關鍵點:假設被刪除的邊出現在以a為源點的最短路樹中,b在被刪除邊的兩點中的某一點的子樹中,則a也一定在b的最短路樹中。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef pairp;

const int maxn = 105;

const int maxm = 3005;

const int inf = 1e9;

struct edge;

int n,m;

vectorg[maxn];

int dis[maxn],sum[maxn];

int uu[maxm],vv[maxm];

priority_queue,greater> que;

void init()}}

int res = 0;

for(int i=1;i<=n;i++){

//cout<

HDU 2433 Travel 最短路樹

題意 給乙個n個點m條邊的無向圖 分別刪除每條邊 問刪除後的新圖中 分別以每個點為原點 到其它點的最短距離之和 圖不連通時輸出inf 思路 如果對於每一條邊刪除後都做n次最短路 則時間複雜度為o m n m log n 時間複雜度太高 仔細分析一下不難發現 只有刪除的邊是最短路樹上的邊 各點之間的最...

HDU 2433 (最短路BFS 預處理)

讀了個大概跑了個nm2 邊權相等 bfs 這個題暴力nm2,得優化,是n還是m,會發現每次刪邊,刪的是最短路徑的邊,就不用跑bfs,不是,就跑bfs,預處理 nm 不刪邊 nm 列舉 刪邊 n2 m pragma gcc optimize 2 include typedef long long ll...

POJ 3230 Travel(最短路 狀壓DP)

一張 n n 個節點 m role presentation style position relative m m條邊的圖,每個節點代表乙個城市,每條邊代表連線兩個城市,花費一定的路徑 雙向 你選擇了 h h 個城市,現在要這些城市中打工。在第 i role presentation style ...