資料結構中樹的直徑問題

2021-07-02 15:47:53 字數 2032 閱讀 6548

樹的直徑是指樹的最長簡單路。求法: 兩遍bfs :先任選乙個起點bfs找到最長路的終點,再從終點進行bfs,則第二次bfs找到的最長路即為樹的直徑;

原理: 設起點為u,第一次bfs找到的終點v一定是樹的直徑的乙個端點

證明:

1) 如果u 是直徑上的點,則v顯然是直徑的終點(因為如果v不是的話,則必定存在另乙個點w使得u到w的距離更長,則於bfs找到了v矛盾)

2) 如果u不是直徑上的點,則u到v必然於樹的直徑相交(反證),那麼交點到v 必然就是直徑的後半段了

例題:

很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。

為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。

j是t國重要大臣,他巡查於各大城市之間,體察民情。所以,從乙個城市馬不停蹄地到另乙個城市成了j最常做的事情。他有乙個錢袋,用於存放往來城市間的路費。

聰明的j發現,如果不在某個城市停下來修整,在連續行進過程中,他所花的路費與他已走過的距離有關,在走第x千公尺到第x+1千公尺這一千公尺中(x是整數),他花費的路費是x+10這麼多。也就是說走1千公尺花費11,走2千公尺要花費23。

j大臣想知道:他從某乙個城市出發,中間不休息,到達另乙個城市,所有可能花費的路費中最多是多少呢?

輸入格式:

輸入的第一行包含乙個整數n,表示包括首都在內的t王國的城市數

城市從1開始依次編號,1號城市為首都。

接下來n-1行,描述t國的高速路(t國的高速路一定是n-1條)

每行三個整數pi, qi, di,表示城市pi和城市qi之間有一條高速路,長度為di千公尺。

輸出格式:

輸出乙個整數,表示大臣j最多花費的路費是多少。

樣例輸入:

5 1 2 2

1 3 1

2 4 5

2 5 4

樣例輸出:

135樣例說明:

大臣j從城市4到城市5要花費135的路費。

資源約定:

峰值記憶體消耗 < 64m

cpu消耗 < 5000ms

這道題是藍橋杯省賽(2023年)的最後一道題,測試資料中最大是10000個城市,顯然不能選用鄰接矩陣(int a[10000][10000]得400mb記憶體) 所以我們選用樹來存放資料(我當時選用是圖的鄰接表,沒有迴路的圖,其實也是樹,實質一樣)

我是用深度優先搜尋,**如下:

#include 

#include

struct node;

struct nodelist;

nodelist a[10001]; //存放城市的節點

int b[10001]; //判斷是否走過了這個城市

int n;

int at;

int max;

int count;

int cc;

void insert(int p, int q, int d);

void f(int i);

int main()

scanf("%d", &n);

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

f(1);//用到了樹直徑知識

count = 0;

f(cc);

printf("%d", (21 + count) * count / 2);

return0;}

void insert(int p, int q, int d)

else

temp->next = pt;

}}void f(int i)

f(p->q);

max -= p->len;

b[p->q] = 0;

}p = p->next;

}b[i] = 0;

}

剛開始是用鄰接矩陣來存放,沒有注意到大資料存在,總有50%資料不能通過,後來用鄰接表後,程式通過了。

資料結構中的樹儲存結構

圖1 樹的示例 圖 1 a 是使用樹結構儲存的集合 的示意圖。對於資料 a 來說,和資料 b c d 有關係 對於資料 b 來說,和 e f 有關係。這就是 一對多 的關係。將具有 一對多 關係的集合中的資料元素按照圖 1 a 的形式進行儲存,整個儲存形狀在邏輯結構上看,類似於實際生活中倒著的樹 圖...

樹的直徑應用問題

題意 輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n n 10000 接下來有n 1行,每一行兩個數,對於第i行的兩個數,它們表示與i號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過10 9,每個數之間用乙個空格隔開。輸出 對於每組測試資料輸出n行,第i行表示i號電腦的...

資料結構 樹

樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...