並查集水題 POJ 1611

2021-07-02 14:23:14 字數 2013 閱讀 8282

題意:有n(n<=30000)個學生,每個學生屬於乙個團體(可以屬於多個團體),共有m(<=500)個團體,如果乙個學生是嫌疑人,則他所在的團體的所有人都是嫌疑人,初始時0號學生是嫌疑人。問總共有多少個嫌疑人。

很明顯同乙個團體的學生可以連一條邊,即求0號點所在的連通塊有多少個點,用並查集可以很方便的辦到,如果兩個點屬於同乙個連通塊則把他們的代表元連線起來即可,始終把較小的那個節點作為父節點,所以最後p[0]的節點數就是答案。

**:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std; #define pb push_back #define mp make_pair #define rep(i,x,n) for(int i=x;i<(n);++i) #define for(i,l,h) for(int i=(l);i<=(h);++i) #define ford(i,h,l) for(int i=(h);i>=(l);--i) #define sz(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() #define ri(x) scanf("%d", &(x)) #define rii(x, y) scanf("%d%d", &(x), &(y)) #define riii(x, y, z) scanf("%d%d%d", &(x), &(y), &(z)) #define dri(x) int (x); scanf("%d", &x) #define drii(x, y) int x, y; scanf("%d%d", &x, &y) #define driii(x, y, z) int x, y, z; scanf("%d%d%d", &x, &y, &z) #define oi(x) printf("%d",x); #define rs(x) scanf("%s", (x)) #define ms0(x) memset((x), 0, sizeof((x))) #define ms1(x) memset((x), -1, sizeof((x))) #define len(x) strlen(x) #define f first #define s second #define swap(a, b) (a ^= b, b ^= a, a ^= b) #define dpoint strcut node #define cmpd int cmp(const int &a,const int &b) /*#ifdef home freopen("in.txt","r",stdin); #endif*/ const int mod = 1e9+7; typedef vector

vi; typedef vector

vs; typedef vector

vd; typedef long long ll; typedef pair

pii; //#define home int scan() /*----------------please-----do-----not-----hack-----me--------------------*/ struct node ; node p[35000]; int find(int x) int main() { int n,m; while(rii(n,m)!=eof) { if(!n&&!m) break; for(int i=0;i

POJ 1611經典並查集

題意 n,m。n個人,編號0 n 1,m個組合 第乙個數表示本集合個數,後面是成員。乙個成員可以在多個集合裡。0號是病人,跟她乙個組合的全是病人,問一共有多少人患病。解析 直接並查集基本模板,加入乙個vis陣列來記錄與本節點相連的樹的元素個數。最後輸出vis 0 即可。vis i 1的乙個初始化記得...

poj1611 帶權並查集

題意 有 個學生,個組,每個學生可能屬於多個組,現在 號得了 和 號一組的也會得,然後和 號一組的人,他所在的組的組員也全會得,問最後總共幾個人得了 思路 只要加乙個權值,就是這個組有多少個人 如r i 表示 所在的組有多少人 所以每次並的時候,也要把這個組的人數並過去 最後陣列 所在的組有幾個人 ...

poj 1611 並查集 題解記錄

解析 本題本質就是並查集的變形,我的想法是每一組輸入時,把最小的數作為全組的父節點,然後用乙個set記錄下所有資料 剔除重複數 最後再for迴圈set中的資料,如果該資料的父節點是0,那麼就是有被感染的嫌疑。如下 include include include includeusing namesp...