#include<iostream>#include<vector>usingnamespace std;typedeflonglong ll;typedef pair<int,int> PII;#defineendl'\n'#definepbpush_back#definefifirst#definesesecondconstint N =1010, M =5e5+10;int fa[N];structEdge{int u, v;}e[M];intfind(int x){if(fa[x]!= x) fa[x]=find(fa[x]);return fa[x];}intmain(){cin.tie(nullptr)->sync_with_stdio(false);int n, m, k; cin >> n >> m >> k;for(int i =0; i < m; i ++) cin >> e[i].u >> e[i].v;while(k --){int x; cin >> x;for(int i =1; i <= n; i ++) fa[i]= i;int cnt = n -1;for(int i =0; i < m; i ++){int u = e[i].u, v = e[i].v;if(u != x && v != x){u =find(u), v =find(v);if(u != v){cnt --;fa[u]= v;}}}cout << cnt -1<< endl;}}
#include<iostream>#include<vector>#include<algorithm>usingnamespace std;constint N =1e4+10;typedef pair<int,int> PII;int n;int hc[N], ha[N];bool st[N];
PII e[N *2];int m;int pa[N];int c[N];structFamily{int id, c, hc, ha;booloperator<(const Family &t)const{// ha / c > t.ha / t.cif(ha * t.c != t.ha * c)return ha * t.c > t.ha * c;return id < t.id;}};intfind(int x){if(pa[x]!= x) pa[x]=find(pa[x]);return pa[x];}intmain(){scanf("%d",&n);int id, fa, mo, k, son;for(int i =1; i <= n; i ++){scanf("%d%d%d%d",&id,&fa,&mo,&k);st[id]=true;if(fa !=-1) e[m ++]={id, fa}, st[fa]=true;if(mo !=-1) e[m ++]={id, mo}, st[mo]=true;for(int j =1; j <= k; j ++){scanf("%d",&son);e[m ++]={id, son};st[son]=true;}scanf("%d%d",&hc[id],&ha[id]);}for(int i =0; i < N; i ++) pa[i]= i, c[i]=1;for(int i =0; i < m; i ++){int a = e[i].first, b = e[i].second;a =find(a), b =find(b);if(a != b){if(a > b)swap(a, b);hc[a]+= hc[b];ha[a]+= ha[b];c[a]+= c[b];pa[b]= a;}}vector<Family> family;for(int i =0; i < N; i ++){if(st[i]&& pa[i]== i)family.push_back({i, c[i], hc[i], ha[i]});}sort(family.begin(), family.end());printf("%d\n", family.size());for(auto&f : family)printf("%04d %d %.3lf %.3lf\n", f.id, f.c,(double)f.hc / f.c,(double)f.ha / f.c);}
1118 Birds in Forest (25 分)
題意 :
假設所有出現在同一張照片中的鳥都屬于同一棵樹。
請你幫助科學家計算森林中樹木的最大數量,對于任何一對鳥類,請判斷它們是否在同一棵樹上。
思路 :
連通塊的數量就是鳥的數量減去被合并的次數
#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;constint N =10010;int n;int birds[10];int p[N];bool st[N];intfind(int x){if(p[x]!= x) p[x]=find(p[x]);return p[x];}intmain(){scanf("%d",&n);for(int i =0; i < N; i ++) p[i]= i;int cnt =0;for(int i =0; i < n; i ++){int k;scanf("%d",&k);for(int j =0; j < k; j ++){scanf("%d",&birds[j]);st[birds[j]]=true;}for(int j =1; j < k; j ++){int a = birds[j -1], b = birds[j];a =find(a), b =find(b);if(a != b){p[a]= b;cnt ++;}}}int tot =0;for(int i =0; i < N; i ++) tot += st[i];printf("%d %d\n", tot - cnt, tot);int q;scanf("%d",&q);while(q --){int a, b;scanf("%d%d",&a,&b);if(find(a)==find(b))puts("Yes");elseputs("No");}return0;}