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;}