L2 007 家庭房產(並查集)

2022-08-27 04:48:09 字數 2785 閱讀 7027

給定每個人的家庭成員和其自己名下的房產,請你統計出每個家庭的人口數、人均房產面積及房產套數。

輸入第一行給出乙個正整數n(≤1000),隨後n行,每行按下列格式給出乙個人的房產:

編號 父 母 k 孩子1 ... 孩子k 房產套數 總面積
其中編號是每個人獨有的乙個4位數的編號;分別是該編號對應的這個人的父母的編號(如果已經過世,則顯示-1);k(0≤k≤5)是該人的子女的個數;孩子i是其子女的編號。

首先在第一行輸出家庭個數(所有有親屬關係的人都屬於同乙個家庭)。隨後按下列格式輸出每個家庭的資訊:

家庭成員的最小編號 家庭人口數 人均房產套數 人均房產面積
其中人均值要求保留小數點後3位。家庭資訊首先按人均面積降序輸出,若有並列,則按成員編號的公升序輸出。

10

6666 5551 5552 1 7777 1 100

1234 5678 9012 1 0002 2 300

8888 -1 -1 0 1 1000

2468 0001 0004 1 2222 1 500

7777 6666 -1 0 2 300

3721 -1 -1 1 2333 2 150

9012 -1 -1 3 1236 1235 1234 1 100

1235 5678 9012 0 1 50

2222 1236 2468 2 6661 6662 1 300

2333 -1 3721 3 6661 6662 6663 1 100

3

8888 1 1.000 1000.000

0001 15 0.600 100.000

5551 4 0.750 100.000

最初了解並查集是看的這位哥們的部落格: ,下面我簡單概括一下。

一般題目型別:1、解決有幾個聯通分支的問題。2、判斷兩個結點是否在乙個聯通分支。3、將兩個聯通分支連起來等等。。。。   其實這些問的都差不多,都是要按題目要求把結點劃分成不同的連通分支。

基本構成:

1、int pre[ ]

這個陣列記錄了每個結點的父結點。陣列元素的值就是陣列下標表示的結點的父結點。初始化時所有結點的父結點都是它自身,也就是元素的值等於元素下標。

2、int find(int x)

查詢函式:用於查詢結點的父結點。

3、void union(int x,int y)

合併函式:用於將兩個結點所在的連通分支合為乙個。通過將其中乙個連通分支的根結點的父結點改為另乙個連通分支的根結點。pre[fx]=fy;也可以根據題意做變動,比如這題要求輸出家庭成員的最小編號,那麼就要把編號大的根結點併入編號小的一邊,這樣直接輸出乙個連通分支的根結點就是這個聯通分支中編號最小的了。

並查集並查集,兩個函式就是乙個並,乙個查,再加上乙個存放父結點的陣列。一般來說,乙個並查集對應三個操作:初始化+查詢根結點函式+合併集合函式。

⽤兩個結構體陣列,⼀個data⽤來接收資料,接收的時候順便實現了並查集的操作union,另⼀個陣列ans⽤來輸出最後的答案,因為要計算家庭⼈數,所以⽤visit標記所有出現過的結點,對於每個結點的⽗結點,people++統計⼈數。標記flag == true,計算true的個數cnt就可以知道⼀共有多少個家庭。排序後輸出前cnt個就是所求答案。

#include #include 

#include

using

namespace

std;

struct

datadata[

1005

];struct

ansans[10000

];int father[10000];//

編號都是四位數,表示下標的父節點

bool visit[10000];//

下標所表示的編號是否有人

int find(int x)//

找到x的根結點

void union(int x,int y)//

將x和y合併到一顆樹中

else

if(fx}bool cmp(ans a,ans b)//

家庭資訊首先按人均面積降序輸出,若有並列,則按成員編號的公升序輸出。

intmain()

for(int i=0;i)

if(data[i].mid!=-1

)

for(int j=0;j//

把孩子也加入家族

cin>>data[i].num>>data[i].area;

}for(int i=0;i//

統計

for(int i=0;i<10000;i++)

for(int i=0;i<10000;i++)//

計算每個家族的人均房產套數和房產面積

} sort(ans,ans+10000

,cmp);

printf(

"%d\n

", cnt);

for(int i = 0; i < cnt; i++)

printf(

"%04d %d %.3f %.3f\n

", ans[i].id, ans[i].people,ans[i].num, ans[i].area);

return0;

}

L2 007 家庭房產

給定每個人的家庭成員和其自己名下的房產,請你統計出每個家庭的人口數 人均房產面積及房產套數。輸入格式 輸入第一行給出乙個正整數n 1000 隨後n行,每行按下列格式給出乙個人的房產 編號 父 母 k 孩子1 孩子k 房產套數 總面積 其中 編號 是每個人獨有的乙個4位數的編號 父 和 母 分別是該編...

PAT 並查集 水題 L2 007 家庭房產

給定每個人的家庭成員和其自己名下的房產,請你統計出每個家庭的人口數 人均房產面積及房產套數。輸入格式 輸入第一行給出乙個正整數n 1000 隨後n行,每行按下列格式給出乙個人的房產 編號 父 母 k 孩子1 孩子k 房產套數 總面積 其中編號是每個人獨有的乙個4位數的編號 父和母分別是該編號對應的這...

L2 007 家庭房產c 版本答案

給定每個人的家庭成員和其自己名下的房產,請你統計出每個家庭的人口數 人均房產面積及房產套數。輸入格式 輸入第一行給出乙個正整數n 1000 隨後n行,每行按下列格式給出乙個人的房產 編號 父 母 k 孩子1 孩子k 房產套數 總面積 其中編號是每個人獨有的乙個4位數的編號 父和母分別是該編號對應的這...