CCF 201503 4 網路延時 兩種方法

2021-08-22 16:18:38 字數 2621 閱讀 3147

ccf 201503-4 網路延時 傳送門

初看題: 這不就是多源最短路徑裡長度最大的? floyd? 不過看資料,這樣只能過70%的資料,正解肯定不是這樣. 寫了份floyd交上去, 70分.這說明出題人特別仁慈, 給了這麼多放水的資料, 可是這樣是不是太不公平?

但是什麼是正解呢?

1 ≤ n ≤ 10000,1 ≤ m ≤ 10000, 這麼大個資料,肯定得從題目的特殊性下手

思考一下可能跟最近公共祖先(lca)有關, 因為這樣的路徑一定經過兩個端點的lca.可通過倍增法求出兩個葉子節點的最近公共祖先及距離公共祖先的長度, 然後相加, 找這些長度中最長的.

一對結點查詢大概是logn的複雜度, 但是列舉所有可能的情況是o(n^2)級別的複雜度.綜合起來就是o(n²logn), 這肯定是會超時的, 所以lca也行不通.

那麼還有什麼演算法? 動態規劃?

其實看資料, 最差應該是o(nlogn), 然後最多可能會有個比較大的常數. 當然, 這是資料範圍的限制.

畫個圖來理解. 既然這是一棵樹, 我們就從樹的特殊性來求解. 我們肯定知道所求的路徑的兩端一定是葉子節點, 他們向上查詢祖先結點時一定會有公共祖先(但一般不會存在其中乙個是另乙個的祖先的情況). 我們思考一下這個公共祖先的性質, 會發現,這條路徑的長度就是從這個祖先分別到兩個端點的路徑長度和, 所以想到了什麼? 答案就是所有的中間節點的最大的路徑和.

乙個結點可能會有兩個以上子結點, 而這些路往下,深度最大的兩顆子樹, 深度之和就是答案. 我們定義這樣乙個結構體

struct node 

};

乙個結點儲存了它的父節點, 入度, 最大子樹深度和第二子樹深度. 我們只要把每個入度為0的結點壓入佇列中, 對每個出隊的結點, 更新它父節點的相關資訊(第一第二深度調整, 入度減一, 減到0就入隊), 這樣當隊列為空時, 樹的深度遍歷結束, 答案就是所有節點裡面first + second最大的.

100分**, 自己都屁福自己

#include 

#include

using

namespace

std;

struct node

};const

int maxn = 20000 + 5;

node nodes[maxn];

int n, m, ans = -1;

int main()

queue

q;for (int i = 1; i <= n + m; ++i)

if (nodes[i].degree == 0) q.push(i);

while (!q.empty()) else

if (nodes[parent].second < next)

nodes[parent].degree--;

if (nodes[parent].degree == 0) q.push(parent);

}for (int i = 1; i <= n + m; ++i)

ans = max(ans, nodes[i].first + nodes[i].second);

cout

<< ans;

}

有這麼一條定理

定理:假設路徑s-t為樹的直徑,則從任意一點u出發找到的最遠的點一定是s、t中的一點。

具體證明和分析可以參考這篇部落格: 點我點我

做法就是選乙個點, 從這個點bfs或dfs到最遠的乙個點u, 然後從這個u點bfs或dfs到另乙個點v, 那麼u->v的長度就是樹的直徑, 也就是此題答案.

100分**.

#include 

#include

#include

#include

using

namespace

std;

const

int maxn = 20000 + 5;

vector

g[maxn];

bool vis[maxn] = {};

int n, m, ans = 0, depth[maxn];

int main()

queue

q;q.push(1);

vis[1] = true;

int now;

while (!q.empty())

}q.push(now);

memset(vis, false, sizeof(vis));

vis[now] = true;

while (!q.empty())

}cout

<< depth[now];

}

ccf 201503 4 網路延時 (100分)

問題描述 給定乙個公司的網路,由n臺交換機和m臺終端電腦組成,交換機與交換機 交換機與電腦之間使用網路連線。交換機按層級設定,編號為1的交換機為根交換機,層級為1。其他的交換機都連線到一台比自己上一層的交換機上,其層級為對應交換機的層級加1。所有的終端電腦都直接連線到交換機上。當資訊在電腦 交換機之...

CCF 201503 4 網路延時(求樹的直徑)

問題描述 給定乙個公司的網路,由n臺交換機和m臺終端電腦組成,交換機與交換機 交換機與電腦之間使用網路連線。交換機按層級設定,編號為1的交換機為根交換機,層級為1。其他的交換機都連線到一台比自己上一層的交換機上,其層級為對應交換機的層級加1。所有的終端電腦都直接連線到交換機上。當資訊在電腦 交換機之...

CCF認證201503 4網路延時

原題鏈結 ccf認證201503 4網路延時 思路 題目中並沒有區分主機和交換機,所有可以把他們當成是一樣的。還有需要注意的是,將樹進行雙向的儲存。樹的直徑 樹中任意兩點距離的最大值 求法 從樹的任意一點y,通過bfs到達終點x 則x必為直徑的乙個端點。再從x通過bfs到達終點z。z必為直徑的另乙個...