題目
題目要求使一條邊邊權為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 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市 葉子節點所表示的城市 決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市的...