小A参加了一个n人的活动,每个人都有一个唯一编号i(i>=0 & i<n),其中m对相互认识,在活动中两个人可以通过互相都认识的一个人介绍认识。现在问活动结束后,小A最多会认识多少人?
小A参加了一个n人的活动,每个人都有一个唯一编号i(i>=0 & i<n),其中m对相互认识,在活动中两个人可以通过互相都认识的一个人介绍认识。现在问活动结束后,小A最多会认识多少人?
第一行聚会的人数:n(n>=3 & n<10000);
第二行小A的编号: ai(ai >= 0 & ai < n);
第三互相认识的数目: m(m>=1 & m
< n(n-1)/2);
第4到m+3行为互相认识的对,以','分割的编号。
输出小A最多会新认识的多少人?
7 5 6 1,0 3,1 4,1 5,3 6,1 6,5
3
// Union_Find_Algorithm #include <stdio.h> #include <stdlib.h> // Path Compression (路径压缩) int Find(int* p, const int x) { return *(p + x) = *(p + x) ^ x ? Find(p, *(p + x)) : x; } // Union By Rank (暂不考虑按秩合并) void Union(int* p, const int u, const int v) { *(p + Find(p, u)) = *(p + Find(p, v)); } int main(const int argc, const char* argv[]) { int n, ai, m, i; fscanf(stdin, "%d %d %d", &n, &ai, &m); int p[n]; for (i = 0; i < n; ++i) *(p + i) = i; int u, v, count = 1; while (m--) { fscanf(stdin, "%d,%d", &u, &v); if (u == ai || v == ai) ++count; Union(p, u, v); } int cnt = 0, pid = Find(p, ai); for (i = 0; i < n; ++i) cnt += Find(p, i) == pid; return printf("%d", cnt - count), 0; }
#include <vector> using namespace std; void depth_first_search_algorithm(vector<vector<int>>& g, vector<int>& seen, int cur, int& ccs) { if (seen[cur]++) return; ++ccs; for (int nxt : g[cur]) depth_first_search_algorithm(g, seen, nxt, ccs); } int main(const int argc, const char** argv) { int n, ai, m, count = 1; cin >> n >> ai >> m; vector<vector<int>> g(n); vector<int> seen(n, 0); int a, b; while (m--) { fscanf(stdin, "%d, %d", &a, &b); if (a == ai || b == ai) ++count; g[a].emplace_back(b); g[b].emplace_back(a); } int ccs = 0; // connected component size ; // 连通分量的大小 depth_first_search_algorithm(g, seen, ai, ccs); cout << ccs - count; return 0; }