HDOJ 3938 Portal 離線並查集

2021-07-14 17:04:32 字數 1419 閱讀 4414

給出乙個帶邊權的圖,令兩個點之間的路徑的費用為中途經過的邊的最大值,對每個查詢求有多少對點路徑費用小於等於給定的l。

用類似kruskal的思想,每個點都設定乙個sum陣列表示它所相連的所有滿足小於當前l的邊相連的點有多少個(其實陣列名用size更合適)。

然後對於每次查詢l,因為邊我們也是公升序排序的,所以對於所有小於l的邊都有sum[find(edge[i].u)]*sum[find(edge[i].v)]對點滿足條件,(iff find(edge[i].u) != find(edge[i].v))

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define lowbit(x) ((x)&(-x))

#define lson l, mid, rt << 1

#define rson mid + 1, r, rt << 1|1

#define mp(a, b) make_pair(a, b)

const

int inf = 0x3f3f3f3f;

const

int mod = 1000000007;

const

int maxn = 50000 + 7;

const

double eps = 1e-8;

const

double pi = acos(-1.0);

typedef pair pii;

struct edge

edge[maxn];

struct q

query[maxn];

int n, m, q;

int fa[maxn];

ll sum[maxn], ans[maxn];

void init()

int find(int x)

void merge(int u, int v)

int main()

); sort(query, query + q, (q a, q b));

int cnt = 0;

for (int i = 0; i < q; i++)

cnt++;}}

for (int i = 0; i < q; i++)

printf("%i64d\n", ans[i]);

}return

0;}

hdu 3938 Portal 離線 並查集

題意描述 簡單的講就是,給你一張無向圖,求有多少條路徑使得路徑上的花費小於l,這裡路徑上的花費是這樣規定的,a b兩點之間的多條路徑中的最長的邊最小值!思路 原理最小生成樹,相通的點是乙個集合,兩個集合合併的時候,裡面的點數乘積就是合併之後的路徑數 include include includeus...

HDU 3938 Portal (並查集 離線)

兩點之間建立傳送門需要的能量為他們之間所有路徑裡最小的t,一條路徑的t為該路徑上最長的邊的長度。現在 q 個詢問,問 l 能量可以選擇多少種不同點對?因為小的能量找出的點對,在大的能量下肯定也能建立傳送門,因此把詢問記下來,按詢問的能量從小到大計算,這樣離線處理。從小到大列舉新增每條能量不超過當前能...

HDU 3938 Portal 並查集,離線

題目鏈結 查詢有多少對 x,y 使得x到y至少存在一條路徑,路徑上的邊權值最大值不超過l。從小到達依次列舉各個邊,就能得到若干個圖,圖里的每條邊都不大於當前的最大邊 廢話 但是問題在於如何求出每次新加入一條邊之後的點的對數,因為所有的邊不一定是全都連線一起的。如果一條邊把乙個點連入乙個圖里的話,那麼...