今天复习了一下堆的两种排序方法,又学习了一下并查集。
下附上问题描述和代码
#include<iostream> using namespace std; int f[1001] = { 0 }, n, m, sum = 0;
void init() { int i; for (i = 1; i <= n; i++) f[i] = i; return; }
|
int getf(int v) { if (f[v] == v) return v; else { f[v] = getf(f[v]); return f[v]; } }
|
void merge(int v, int u) { int t1, t2; t1 = getf(v); t2 = getf(u); if (t1 != t2) f[t2] = t1; }
|
int main() { int i, x, y; scanf("%d %d",&n, &m); init(); for (i = 1; i <= m; i++) { scanf("%d %d", &x, &y); merge(x, y); }
for (i = 1; i <= n; i++) if (f[i] == i) sum++;
printf("%d\n", sum); system("pause"); }
|
最终返回的是有多少个独立团伙。
运行结果:
最后结果是3.
附上今日份的山大月饼,馋你们。