樹的直徑是指樹的最長簡單路。求法: 兩遍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.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...