題意:
給出N個人的M個關係,如果A認識B,B認識C,那麼C認識A,ABC三個人就可以安排在一起,問題給出M個關係之後,存在多少個圈子,使得圈子內的人全部認識。
分析:
使用並查集這數據結構在很好的時間複雜度內解決該題目
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 1000 + 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], 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 cas, n, m, u, v;
scanf("%d", &cas);
REPI(z, 1, cas) {
scanf("%d %d", &n, &m);
REPI(i, 1, n) {
parent[i] = i;
hash[i] = 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;
}
}
REPI(i, 1, n) {
parent[i] = get_parent(i);
}
REPI(i, 1, n) {
hash[parent[i]] += 1;
}
int cnt = 0;
REPI(i, 1, n) {
cnt += (hash[i])? 1 : 0;
}
printf("%d\n", cnt);
}
return 0;
}
HDU_1213_How Many Tables(並查集)
最新推荐文章于 2020-05-08 22:05:27 发布