JZOJ A組 盟主的憂慮

2021-08-29 10:24:22 字數 1274 閱讀 7582

江湖由 n 個門派(2≤n≤100,000,編號從 1 到 n)組成,這些門派之間有 n-1 條小道將他們連線起來,每條道路都以「尺」為單位去計量,武林盟主發現任何兩個門派都能夠直接或者間接通過小道連線。

雖然整個江湖是可以互相到達的,但是他擔心有心懷不軌之徒破壞這個武林的安定,破壞小道,於是武林盟主又秘密地修建了 m 條密道(1≤m≤100,000),但每條小道距離都不超過10億尺。

果不其然,最近乙個名叫「太吾」的組織意欲破壞武林的小道,請你幫盟主想想辦法,如果門派 a 到門派 b 的直連小道被破壞,從 a 走到 b 的所有路徑中,經過密道的距離最少是多少?

第一行數字 n m

接下來 n-1 行,每行兩個整數 a b,表示 a-b 間有一條直連小道

接下來 m 行,每行三個數字 a b v,表示 a-b 間有一條代價為 v 的密道

輸出 n-1 行,對應原輸入的小道,每個小道被破壞後,最少需要經過多長的密道?如果不存在替換的道路,請輸出-1

6 34 1

1 34 5

1 26 5

3 6 8

2 3 7

6 4 587

57530%資料:n<=300,m<=1000

50%資料:n<=1000,m<=1000

70%資料:n<=5000,m<=5000

對於另外15%的資料點:樹是一條鏈

100%資料:n,m<=100,000

將所有密道按照權值從小到大排序。

對於一條密道(u,v,w),如果u到v的路徑上的邊中存在邊之前還沒有被覆蓋過,那麼說明這條邊的答案就是w.

可以用並查集維護,維護每個集合深度最小的節點,對於密道(u,v,w),每次u都在它所在集合中找到深度最小的點,這個點與父親的連邊一定就是上述的邊,將這條邊的答案更新為w,然後將這個節點與其父親合併,直到u所在集合的深度最小的節點是小於u和v的lca的,對v做同樣的過程即可。

#include#include#include#includeusing namespace std;

const int maxn=1e5+77;

int n,m,dep[maxn],list[maxn],f[maxn],f1[maxn],d[maxn],p[maxn],cnt;

struct a

a[maxn];

struct e

e[maxn*2];

bool cmp(a x,a y)

for(int i=1; i<=n-1; i++) printf("%d\n",d[i]);

}

NOIP模擬賽 盟主的憂慮

顯然任意所求路徑就只經過一條密道,然後呢,畫圖發現就是乙個個環,然後可以用並查集來維護屬於乙個環或者是直接賦值 includeusing namespace std long long read while ch 0 ch 9 return num struct ooedge 200005 stru...

nssl1256 C 盟主的憂慮 並查集

n個點的一棵樹,增加了m條密道。對於樹上每條邊 a,b a,b a,b 被破壞後,要求a b a sim b a b經過密道最短。引理 對於每個道路被破壞,最多隻會經過一條邊。證明 對於每個答案,被破壞後,所在層數低的點找到一條可以走出他的子樹的邊就好了,如果要走兩條邊,中間的點要不在子樹中,要不在...

JZOJ A組 量子糾纏

第一行包含乙個正整數 m,代表運算元。接下來 m 行,每行可能有以下形式 1 s 代表將數字串 s 加入資訊集中 2 s 代表詢問數字串 s 是否在資訊集中 3 a b 代表使數字串 a 和 b 互相糾纏 對於每乙個 2 操作,如果詢問串不在集合中,請輸出一行乙個整數 0,否則輸出一行乙個整 數 1...