最短路徑樹

2021-07-15 02:46:47 字數 1505 閱讀 7226

【問題描述】

所謂最短路徑樹,就是從s出發,沿著樹上的邊走到任意點i,那麼經過的這些邊的權值和就是s到i的最短路徑。dijkstra演算法或spfa演算法不僅可計算從起點s到各點的最短路徑長度,同時也可得到以s為根的最短路徑樹。方法是在進行鬆弛操作時,如果d[i] + c < d[j] 時,除了更新d[j]之外,還要設定fa[j]=i。這樣把fa[j]看成j的父親指標,則所有點形成了一棵樹(因為每個結點都有唯一的前驅)。這樣要從起點s出發沿最短路走到任意點,只需要順著樹邊走即可。

現在請你利用最短路徑樹解下面這個決問題:

n個城市用m條雙向公路連線,使得任意兩個城市都能直接或間接地連通。其中城市編號為1..n,公路編號為1..m。任意個兩個城市間的貨物運輸會選擇最短路徑,把這n*(n-1)條最短路徑的和記為s。

現在你來尋找關鍵公路r,公路r必須滿足:當r堵塞之後,s的值會變大(如果r堵塞後使得城市u和v不可達,則s為無窮大)。

【輸入格式】

第1行包含兩個整數n,m,接下來的m行,每行用三個整數描述一條公路a,b,len(1<=a,b<=n),表示城市a和城市b之間的公路長度為len,這些公路依次編號為1..m。

【輸出格式】

從小到大輸出關鍵公路的編號。

【輸入樣例】

4 6

1 2 1

2 3 1

3 4 1

1 4 1

1 3 1

4 1 1

【輸出樣例】

1 2

3 5

【資料範圍】

對於20%的資料,有n<=50,1<=m<=1000。

對於100%的資料,有n<=100,1<=m<=3000,1<=len<=10000。

此題需要一每個點為起點生成乙個最短路徑樹,再在樹上列舉每條邊,看是否是重要邊。

#include

#include

#include

#include

#include

using namespace std;

const int maxn=105;

const int maxm=3005;

const int inf=200000000;

struct shu

;vectorg[maxn],w[maxn],idn[maxn];

int n,m,d[maxn],fa[maxn],vis[maxn]=,q[maxn*maxn];

bool mark[maxm]=;

void init()

}void in()

void spfa1(int

x) }

}void spfa2(int

x,int

y) }

}int main()

}for(int i=1;i<=m;i++)

if(mark[i])

printf("%d\n",i);

return

0;}

最短路徑,最短路徑樹和最小生成樹

首先介紹這三個概念,很多人都聽過最短路徑了,但是最短路徑樹卻很少聽過,關於最短路徑樹的介紹也不太多。而最短路徑樹和最小生成樹更是完全不同的兩個概念。最短路徑就是從乙個指定的頂點出發,計算從該頂點出發到其他所有頂點的最短路徑。通常用dijkstra演算法,floyd演算法求解。最短路徑樹spt sho...

Codeup最短路徑 最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...