【問題描述】
所謂最短路徑樹,就是從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,...