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

2022-05-06 18:00:13 字數 2648 閱讀 7168

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

輸入格式:

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

編號 父 母 k 孩子1 ... 孩子k 房產套數 總面積

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

輸出格式:

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

家庭成員的最小編號 家庭人口數 人均房產套數 人均房產面積

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

1、觀察最後兩行會發現,2222和2333有相同的孩子——他們的關係沒法通過父母的關係網連線到一塊;

所以輸入孩子也應該連線進關係網中,如果在網中,孩子的父母也指向孩子的根節點;

否則,孩子指向他的該行的父或者母。

2/最後並查集記得進行再次全體進行尋根一次!

3、每次新開乙個b【】陣列時,記得立即初始化一次!!

4.還出了乙個段錯誤! 您的程式發生段錯誤,可能是陣列越界,堆疊溢位(比如,遞迴呼叫層數太多)等情況引起!

後來造了一組無厘頭的資料:

31222 0 23 0 3 300

0 3 -1 0 1 0

3 0 -1 0 1 0

然後程式就炸了,接著仔細想想——搞了半天我沒用上並查集的基本操作add()!!

ac程式:(附注釋)

#include#include

#include

#include

#include

#include

#include

#include

#include

#define maxn 400000

#define inf 0x3f3f3f3f

using

namespace

std;

#define n 10018

struct

nodea[n];

struct

familyb[n];

int tree[n];//

建立一棵並查集,tree[i]=x,x表示i的父節點

int vis[n];//

記錄i是否記錄進了人數

int getfa(int

x)void add(int x,inty)}

void init(family &x)

int fact1id(int

i)

return

num;

}int fact2(int

i)

if(a[i].mo!=-1&&vis[a[i].mo]==0

)

if(a[i].fa!=-1&&vis[a[i].fa]==0

)

for(int j=1;j<=a[i].k;j++)

return

num;

}bool

cmp(family x,family y)

intmain()

while(n--)

if(a[id].mo!=-1

) getfa(id);

scanf("%d

",&a[id].k);

for(int i=1;i<=a[id].k;i++)

scanf(

"%d%d

",&a[id].suit,&a[id].area);

}for(int i=0;i<=9999;i++)//

並查集重新調整一次!

getfa(i);

int cnt=0;//

統計家庭數

sets;//

記錄根節點

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

int fa=tree[i];

int k;//

表示開的family陣列的序號

if(s.count(fa)>0

) }

}else

//將a[i]陣列的內容轉移到b[k]中

b[k].area+=a[i].area;

b[k].minn_id=min(b[k].minn_id,fact1id(i) );

b[k].pnum+=fact2(i);

b[k].suit+=a[i].suit;

}for(int i=1;i<=cnt;i++)

sort(b+1,b+1+cnt,cmp);

printf(

"%d\n

",cnt);

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

return0;

}

view code

L2 007 家庭房產(並查集)

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

L2 007 家庭房產

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

L2 007 家庭房產c 版本答案

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