洛谷P1084 運輸計畫

2022-03-17 15:02:56 字數 1211 閱讀 1929

題目

題目要求使一條邊邊權為0時,m條路徑的長度最大值的最小值。

考慮二分此長度最大值

首先需要用lca求出樹上兩點間的路徑長度。然後取所有比mid大的路徑的交集,判斷有哪些邊在這些路徑上都有出現,然後這些邊裡面取最大值當做蟲洞,如果還是不行說明此mid不行。

判斷邊可以用把邊化為點,然後樹上差分判斷每個點是否出現在所有大路徑中。

#include #define n 1000131

#define m 400101

using namespace std;

struct edg e[n];

int p, m, cnt, tot, lin[m], data[m], fr[m], rn[m], fa[m][20], de[m], dis[m], u2[m], v2[m], su[m];

inline void add(int f, int t, int l)

void dfs(int w, int f)

}int dfs2(int u, int f)

return su[u];

}inline void init()

int lca(int u, int v)

int dist(int u, int v)//返回樹上兩點間的路徑和

bool check(int mid)//已知如何求兩點間的距離和兩點間的最大值。

} //找到當前所有點權的需要滿足的最大值。

dfs2(1, 0);

int maxn = 0;

for (int i = 1; i <= p; i++)

if (su[i] >= tot)//如果該點的路徑總數等於tot

return 0;

} inline int read() while('0' <= ch && ch <= '9') return x * f;

}signed main()

add(a, b, c);

add(b, a, c);

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

fr[i] = read(), rn[i] = read();

init();

int l = 0, r = 85000000, ans = 0;

while (l <= r)

printf("%d", ans);

}

洛谷P1084 (疫情控制)

h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市 的每一條路徑上都至少有乙...

洛谷P1084 疫情控制

題目 細節比較多的二分 跟lca倍增差不多的思想 首先有這樣乙個貪心思路,深度越低的檢查點越好,而最長時間和深度具有單調性,即給定時間越長,每個軍隊能向更淺的地方放置檢查點。因此可以考慮二分時間,然後判斷軍隊是否可以放置在控制疫情的地方。include define n 1001001 using ...

NOIP2012 洛谷P1084 疫情控制

description h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市的...