C++数据结构——热闹的聚会
熱鬧的聚會(huì)
今天是小明的生日,他邀請(qǐng)了許多朋友參加聚會(huì),當(dāng)然,有些朋友之間由于互不認(rèn)識(shí),因此不愿意坐在同一張桌上,但是如果A認(rèn)識(shí)B,且B認(rèn)識(shí)C,那么A和C就算是認(rèn)識(shí)的。
為了使得聚會(huì)更加熱鬧,就應(yīng)該盡可能少用桌子。那么,最熱鬧(人數(shù)最多的)的那一桌一共有多少人嗎?
輸入格式:
首先輸入一個(gè)整數(shù)T,表示測(cè)試數(shù)據(jù)的組數(shù),然后是T組測(cè)試數(shù)據(jù)。每組測(cè)試數(shù)據(jù)首先輸入2個(gè)整數(shù)n和m (1≤n , m≤1000)。其中n表示朋友總數(shù),并且編號(hào)從1到n;然后輸入m行數(shù)據(jù),每行2個(gè)整數(shù)A和 B (A≠B), 表示朋友A和B相互認(rèn)識(shí)。
輸出格式:
對(duì)于每組測(cè)試,輸出最熱鬧的那一桌的總?cè)藬?shù)。
輸入樣例:
3
5 3
1 2
2 3
4 5
5 1
2 5
10 9
7 8
1 5
1 7
1 2
1 3
1 4
2 6
2 9
9 2
輸出樣例:
3
2
9
代碼長(zhǎng)度限制 16 KB 時(shí)間限制 400 ms 內(nèi)存限制 64 MB
解題代碼
#include<bits/stdc++.h> using namespace std; int men[1005]; int ans[1005]; int find(int x) {if(men[x]==x){return men[x];} men[x]=find(men[x]);return men[x]; }void Union(int a,int b) //合并 {a = find(a);b = find(b);if(a!=b){men[b]=a;ans[a]+=ans[b];} }int main() {int T,n,m,a,b;cin>>T;while(T--){cin>>n>>m;;for(int i=1;i<=n;i++){men[i]=i;ans[i]=1;}for(int i=0;i<m;i++){cin>>a>>b;Union(a,b);}int maxNum = 0;for(int i=1;i<=n;i++){if(ans[i]>maxNum&&men[i]==i)maxNum=ans[i];}cout<<maxNum<<endl;} }解題思路
并查集,這里要每次合并的時(shí)候,要把一邊的數(shù)量存儲(chǔ)到新合并上的一邊,一開始用指針提交pta爆段錯(cuò)誤,離譜
總結(jié)
以上是生活随笔為你收集整理的C++数据结构——热闹的聚会的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UG/NX 装配克隆
- 下一篇: C++直接初始化和复制初始化