試題編號:
201503-4
試題名稱:
網路延時
時間限制:
1.0s
記憶體限制:
256.0mb
問題描述:
問題描述
給定乙個公司的網路,由n臺交換機和m臺終端電腦組成,交換機與交換機、交換機與電腦之間使用網路連線。交換機按層級設定,編號為1的交換機為根交換機,層級為1。其他的交換機都連線到一台比自己上一層的交換機上,其層級為對應交換機的層級加1。所有的終端電腦都直接連線到交換機上。
當資訊在電腦、交換機之間傳遞時,每一步只能通過自己傳遞到自己所連線的另一台電腦或交換機。請問,電腦與電腦之間傳遞訊息、或者電腦與交換機之間傳遞訊息、或者交換機與交換機之間傳遞訊息最多需要多少步。
輸入格式
輸入的第一行包含兩個整數n, m,分別表示交換機的台數和終端電腦的台數。
第二行包含n - 1個整數,分別表示第2、3、……、n臺交換機所連線的比自己上一層的交換機的編號。第i臺交換機所連線的上一層的交換機編號一定比自己的編號小。
第三行包含m個整數,分別表示第1、2、……、m臺終端電腦所連線的交換機的編號。
輸出格式
輸出乙個整數,表示訊息傳遞最多需要的步數。
樣例輸入
4 21 1 3
2 1
樣例輸出
4
樣例說明
樣例的網路連線模式如下,其中圓圈表示交換機,方框表示電腦:
其中電腦1與交換機4之間的訊息傳遞花費的時間最長,為4個單位時間。
樣例輸入
4 41 2 2
3 4 4 4
樣例輸出
4
樣例說明
樣例的網路連線模式如下:
其中電腦1與電腦4之間的訊息傳遞花費的時間最長,為4個單位時間。
評測用例規模與約定
前30%的評測用例滿足:n ≤ 5, m ≤ 5。
前50%的評測用例滿足:n ≤ 20, m ≤ 20。
前70%的評測用例滿足:n ≤ 100, m ≤ 100。
所有評測用例都滿足:1 ≤ n ≤ 10000,1 ≤ m ≤ 10000。
開始確實沒什麼思路,直接dfs暴搜了一下....
果然可以對70%的資料
於是參考了一下其他資料,這道題是求樹的直徑
現有如下結論
主要是利用了反證法:
假設 s-t這條路徑為樹的直徑,或者稱為樹上的最長路
現有結論,從任意一點u出發搜到的最遠的點一定是s、t中的一點,然後在從這個最遠點開始搜,就可以搜到另乙個最長路的端點,即用兩遍廣搜就可以找出樹的最長路
證明:1 設u為s-t路徑上的一點,結論顯然成立,否則設搜到的最遠點為t則
dis(u,t) >dis(u,s) 且 dis(u,t)>dis(u,t) 則最長路不是s-t了,與假設矛盾
2 設u不為s-t路徑上的點
首先明確,假如u走到了s-t路徑上的一點,那麼接下來的路徑肯定都在s-t上了,而且終點為s或t,在1中已經證明過了
所以現在又有兩種情況了:
1:u走到了s-t路徑上的某點,假設為x,最後肯定走到某個端點,假設是t ,則路徑總長度為dis(u,x)+dis(x,t)
2:u走到最遠點的路徑u-t與s-t無交點,則dis(u-t) >dis(u,x)+dis(x,t);顯然,如果這個式子成立,
則dis(u,t)+dis(s,x)+dis(u,x)>dis(s,x)+dis(x,t)=dis(s,t)最長路不是s-t矛盾
那我們就可以先用一遍bfs找到最長路徑的乙個端點,
再用一遍bfs即可以求出最長路徑
ac**如下:
#include #include #include #include #define n 20005
using namespace std;
int v[n];
int d[n];
vectorg[n];
queueq;
int n,m,answer=0,p;
void bfs(int st)
for(int i=0;i>x;
g[x].push_back(++sign);
g[sign].push_back(x);
} bfs(1);
bfs(p);
cout<
CCF 網路延時
201503 4 試題名稱 網路延時 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定乙個公司的網路,由n臺交換機和m臺終端電腦組成,交換機與交換機 交換機與電腦之間使用網路連線。交換機按層級設定,編號為1的交換機為根交換機,層級為1。其他的交換機都連線到一台比自己上一層的交...
CCF 網路延時 樹的直徑
題目 問題描述 給定乙個公司的網路,由n臺交換機和m臺終端電腦組成,交換機與交換機 交換機與電腦之間使用網路連線。交換機按層級設定,編號為1的交換機為根交換機,層級為1。其他的交換機都連線到一台比自己上一層的交換機上,其層級為對應交換機的層級加1。所有的終端電腦都直接連線到交換機上。當資訊在電腦 交...
CCF認證201503 4網路延時
原題鏈結 ccf認證201503 4網路延時 思路 題目中並沒有區分主機和交換機,所有可以把他們當成是一樣的。還有需要注意的是,將樹進行雙向的儲存。樹的直徑 樹中任意兩點距離的最大值 求法 從樹的任意一點y,通過bfs到達終點x 則x必為直徑的乙個端點。再從x通過bfs到達終點z。z必為直徑的另乙個...