求最小偏心距

2021-10-17 03:37:03 字數 2103 閱讀 6151

洛谷p1099

參考的是這篇題解:

完整**:

基於以上**的詳細講解:

本文也是基於第一篇部落格**在講解上的一些補充,設計的知識點有

兩次深度遍歷,第一次是找到乙個端點,第二次是找到另乙個端點

void

dfs(

int f,

int x)

}

主函式中的呼叫如下

dfs(0

,1);

dis[k]=0

,dfs(0

,k);

//k表示最遠的端點

top=k;

//確定直徑

沿用第2個點中的說法,記第二次深度遍歷的遍歷起點是端點a,即直徑的乙個端點是a;我們來另外約定一下,這條直徑的另乙個端點是b,也就是下面for迴圈中的top

//i是頭,j是尾巴

for(

int i=top,j=top,l=

1,r=

0;i;i=fa[i]

)

完成求直徑和樹上尺取後,就完成了大部分工作,但是考慮一下以下輸入資料:

5121

2423

4344

253

這樣選取的路徑就是一整條直徑,這樣就不能在直徑上選取最小偏心距了,處理方法如下:

for

(int i=top;i;i=fa[i]

)mark[i]=1

;//標記直徑,重新計算非直徑上的點到直徑的距離

for(

int i=top;i;i=fa[i]

)//這個for的作用就是比較直徑上的點更遠還是非直徑上的點更遠

//非直徑上的點更遠,只有在選取的路徑就是這條直徑時才會發生

for(

int i=

1;i<=n;i++

) ans=

max(ans,dis[i]

);

這個**是我參考第一篇部落格寫的,思路大概一致,刪掉了一些冗餘的**

#include

#include

#include

#include

#define maxn 600

using namespace std;

struct edgee[maxn*2]

;int id,head[maxn]

;void

add(

int u,

int v,

int w));

head[u]

=id;

}int k,father[maxn]

,dis[maxn]

;int mark[maxn]

;void

dfs(

int f,

int x)

}int n,s;

int u,v,w;

int top;

int ecc;

int min_ecc=

100000010

;int

main()

//找直徑

dfs(0,

1); dis[k]=0

;dfs(0

,k);

top=k;

//樹上尺取

for(

int i=top,j=top;i!=

0;i=father[i]

)//標記直徑

for(

int i=top;i!=

0;i=father[i]

) mark[i]=1

;// 找非直徑上的點到直徑的距離

for(

int i=top;i!=

0;i=father[i]

)for

(int i=

1;i<=n;i++

) min_ecc=

max(min_ecc,dis[i]);

printf

("%d"

,min_ecc)

;}

求最大最小數

題目描述 輸入n個 n 10000 數字,求出這n個數字中的最大值和最小值。每個數字的絕對值不大於1000000。輸入 輸入包括多組測試用例,每組測試用例由乙個整數n開頭,接下去一行給出n個整數。輸出 輸出包括兩個整數,為給定n個數中的最大值與最小值。樣例輸入 5 1 2 3 4 5 33 7 8 ...

floyd求最小環

floyd求最小環 1 定義 通常來說最小環是針對有向圖而言 從乙個點出發,經過一條簡單路徑回到起點成為環.圖的最小環就是所有環中長度最小的.2.怎樣求最小環呢?的解決方法 dijkstra 任意乙個環的權值,我們都可以看成兩個有邊相連的結點i j的直接距離加上i j間不包含邊 邊i j 的最短路徑...

求最小依賴集

這個比較煩,要寫好多好多好多qaq。例 u a,b,c,d,e,g f 求f最小依賴集。解 第一步 右邊單一化。f1 第二步 逐個求,在去掉它的f中求閉包,如果包含右邊屬性,則表示這個函式依賴要去掉。bg c 求 bg bcdeg,包含右邊屬性c,所以去掉。bd e bd bd,不包含右邊e,所以不...