思路:sum[x]表示區間[x,f[x]]的和,這個可以在路徑壓縮的時候更新,對於一組資料(u,v,w),令r1=find(u),r2=find(v),於是若r1==r2,此時u,v就有了相同的參考點,而sum[u]為區間[u,r1(r2)]的和,sum[v]為區間[v,r2(r1)]的和,於是只需判斷w==sum[v]-sum[u]即可;若r1r2這種情況也一樣,這裡就不在贅述了。
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6#define maxn 222222
7int
sum[maxn],father[maxn];
8int
n,m;910
void
initiate()
1116
17int find(int
x)18
2526
bool union(int u,int v,int
w)27
else37}
3839
intmain()
4049 printf("
%d\n
",ans);50}
51return0;
52 }
hdu 3038 帶權並查集)
思路 sum x 表示區間 x,f x 的和,這個可以在路徑壓縮的時候更新,對於一組資料 u,v,w 令r1 find u r2 find v 於是若r1 r2,此時u,v就有了相同的參考點,而sum u 為區間 u,r1 r2 的和,sum v 為區間 v,r2 r1 的和,於是只需判斷w sum...
HDU 3038 帶權並查集
題目大意 n表示有乙個長度為n的陣列,接下來有m行形如x,y,d的輸入,表示從第x,個元素到第y個元素的和為d 包括x,和y 問m行輸入裡面有幾個是錯誤的 第乙個輸入是正確的 思路參考 這題你不告訴我是並查集,我怎麼想得到。複習一下帶權並查集吧。用dis陣列維護乙個點到他當前父親節點的距離,那麼在f...
HDU 3038 帶權並查集
簡單來說,給出n句話,判斷謊言的個數,謊言就是與前面真話衝突的話。帶權並查集的典型題。個人覺得帶權並查集就是給出了結點的相對關係,已知相對關係的點就放到乙個連通的塊裡,也就是並查集有同乙個根節點。這些相對關係又能轉化到乙個結點上,這個結點就是它們共有根節點,而轉化到同一結點的過程就是路徑壓縮的過程。...