hdu_1856_More is better(並查集)

来源:互联网 发布:ubuntu 16.04 lts ati 编辑:程序博客网 时间:2024/06/05 00:13

題意:給你m個關係,有A->B, B->C --> A->C,問最聚成一團的人數的最多的人數是多少分析:無向圖,並查集,m = 0的時候應該輸出1.Code:#include <set>#include <map>#include <cmath>#include <ctime>#include <stack>#include <queue>#include <deque>#include <vector>#include <cstdio>#include <bitset>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define DIR     4#define DIM     2#define STATUS  2#define MAXN    10000000 + 10#define MAXM    100000 + 10#define oo      (~0u)>>1#define INF     0x3F3F3F3F#define REPI(i, s, e)   for(int i = s; i <= e; i ++)#define REPD(i, e, s)   for(int i = e; i >= s; i --)static const double EPS = 1e-5;typedef struct ArcNode_ {        int u, v, w, next;}ArcNode;int parent[MAXN], flag[MAXN], hash[MAXN];inline int get_parent(int x){        return x == parent[x]? x : parent[x] = get_parent(parent[x]);}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE        freopen("test.in", "r", stdin);#endif        int max_idx, m, u, v;        while( ~scanf("%d", &m) ) {                if( !m ) {                        printf("1\n");                        continue;                }                REPI(i, 1, MAXN-1) {                        parent[i] = i;                        flag[i] = 0;                }                max_idx = 0;                REPI(i, 1, m) {                        scanf("%d %d", &u, &v);                        int pu = get_parent(u);                        int pv = get_parent(v);                        if( pu != pv ) {                                parent[pu] = pv;                        }                        flag[u] = flag[v] = 1;                        max_idx = max(max_idx, max(u, v));                }                memset(hash, 0, sizeof(int)*(max_idx+1));                REPI(i, 1, max_idx) {                        if( !flag[i] ) {                                continue;                        }                        hash[parent[i] = get_parent(i)] += 1;                        //printf("parent[%d] = %d\n", i, parent[i]);                }                int cnt = 0;                REPI(i, 1, max_idx) {                        if( !flag[i] ) {                                continue;                        }                        cnt = max(cnt, hash[i]);                }                printf("%d\n", cnt);        }        return 0;}


原创粉丝点击