HDU 6109 資料分割 並查集 啟發式合併

2022-06-08 02:48:06 字數 1266 閱讀 4069

題目鏈結

略對於相等的關係很好維護,關鍵是對於不想等的關係。如果\(x_i\)與\(x_j\)不相等,那麼\(x_i\)所在集合中的所有點都是和\(x_j\)所在集合中的所有點不相等的。

把不相等的\(x_i\)與\(x_j\),所在集合的代表結點建一條邊,如果\(x_i\)所在集合要和其他集合合併,那麼在合併的時候指向被合併集合的邊都要指向合併的集合,反之,被合併集合指向其他集合的邊也要加進合併的集合裡頭。如果兩個合併的集合之間有邊,說明關係衝突。

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define endl '\n'

#define clr(arr,b) memset(arr, b, sizeof(arr))

#define ios ios::sync_with_stdio(false)

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pairp;

typedef pairpll;

const double pi = acos(-1.0);

const double eps = 1e-8;

const ll mod = 1e9+7;

const int inf = 0x3f3f3f3f;

const int maxn = 1e5+10;

const int maxm = 2e6+10;

struct e e[maxm]; int h[maxn], tot;

int l, p[maxn], num[maxn];

void add(int u, int v) ; h[u] = tot;

}int find(int x)

vectorans, tmp;

bool merge(int a, int b)

if (last)

return 0;

}void solve()

int main()

else

}cout << ans.size() << endl;

for (auto v : ans) printf("%d\n", v);

return 0;

}

hdu 6109 資料分割

acm.hdu.edu.cn showproblem.php?pid 6109 給出若干個條件 xi xj 或 xi xj 它們分屬若干組,但組與組之間的分隔符沒了,要重新分隔這幾組條件。每一組條件的特點是 不可能成立,但去掉最後乙個條件後,就可以成立。每次都貪心地常試將盡量多的條件放進當前這組,遇...

HDU3938 並查集 並查集

先按邊權值排個序,每次加入一條邊,用並查集,關鍵看懂題。include include include include using namespace std const int maxn 10010 int n,m,q struct edge edges maxn 5 inline int cmp...

hdu 拓撲排序 並查集

題目大意 有一些池塘,每乙個池塘都有乙個價值,現在想刪除一些池塘。有如下刪除條件 1 乙個池塘有兩個管道連線的不可以刪除。2 求最後剩下的為奇數環的池塘的價值。先用拓撲排序的思路將兩個一下連線的全刪除 只有用並查集統計數目 includeusing namespace std define ll l...