洛谷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,所以不...