題意:
給你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;
}
hdu_1856_More is better(並查集)
最新推荐文章于 2021-10-25 19:11:05 发布