网络分析(带权并查集)
網(wǎng)絡(luò)分析
題意:
有n個(gè)節(jié)點(diǎn),一開(kāi)始彼此獨(dú)立,有兩個(gè)操作,第一個(gè)操作時(shí)是連接兩個(gè)節(jié)點(diǎn),第二個(gè)操作是對(duì)一個(gè)節(jié)點(diǎn)+x,(在進(jìn)行第二個(gè)操作時(shí),與該點(diǎn)相連的點(diǎn)也會(huì)+x)
問(wèn)每個(gè)節(jié)點(diǎn)的權(quán)值
題解:
帶權(quán)并查集
我所理解的帶權(quán)并查集是這樣的,就是把所有權(quán)值全部加到父親節(jié)點(diǎn),在路徑壓縮的情況下,一個(gè)并查集里的權(quán)值全部移動(dòng)到根節(jié)點(diǎn),相當(dāng)于整個(gè)并查集共享整個(gè)權(quán)值,但是有的節(jié)點(diǎn)是在其他節(jié)點(diǎn)被加后再加入并查集的,也就是共享的并查集并不全歸子節(jié)點(diǎn),所以子節(jié)點(diǎn)x的值為d[px]=value[px] - value[py]
px為x的根節(jié)點(diǎn),py為y的根節(jié)點(diǎn),x與y相連
數(shù)組value[x]表示以x為根節(jié)點(diǎn)的并查集共享的權(quán)值
數(shù)組d[x]表示x節(jié)點(diǎn)相對(duì)于根節(jié)點(diǎn)的權(quán)值的差值
代碼:
#include <iostream> using namespace std; const int N = 4E4 + 10; int parent[N], value[N], d[N]; int n, m; int find(int x){if(parent[x] != x){int root = find(parent[x]);d[x] += d[parent[x]];parent[x] = root;}return parent[x]; } int main(){cin >> n >> m;for(int i = 1; i <= n; i ++ ) parent[i] = i;while(m -- ){int op, x, y; cin >> op >> x >> y;if(op == 1){int px = find(x), py = find(y);if(px == py) continue;d[px] += value[px] - value[py];parent[px] = py;}else{int px = find(x);value[px] += y;}}for(int i = 1; i <= n; i ++ ) cout << value[find(i)] + d[i] << ' ';return 0; }總結(jié)
以上是生活随笔為你收集整理的网络分析(带权并查集)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。