並查集 pat1114

#include <iostream>
#include<algorithm>
#include<cstdio>
//1114
using namespace std;
int father[10000];//因爲是4位id
bool vis[10000];
struct Data{
       int id;
       int fid;
       int mid;
       int numS;
       int area;
       int cid[10];
}data[1005]; // 1000個人

struct node{
       int id, numP;
       double numS, area;
       bool flag = false;
}ans[10000];  //四位id


void init(int n){
       for(int i = 1;i<=n;i++){
              father[i] = i;
       }
}

int findFather(int x){
       while(x!=father[x]){
              x= father[x];
       }
       return x;
}

void Union(int a, int b){
       int faA = findFather(a);
       int faB = findFather(b);
       if(faA > faB){              //實現題目要求家庭用最小id來標記
              father[faA] = faB;
       }else if(faA<faB){
              father[faB] = faA;
       }

}

bool cmp(node a, node b){
       if(a.area != b.area)
              return a.area > b.area;
       else
              return a.id<b.id;
}
int main()
{
      freopen("1114.txt","r",stdin);

       int n,k;
       scanf("%d",&n);
//       init(n);
//初始化
       for(int i = 0; i < 10000;i++){
              father[i]=i;
       }
       //輸入的同時 合併
       for(int i = 0;i < n; i++){
              scanf("%d %d %d %d",&data[i].id,&data[i].fid,&data[i].mid,&k);
              vis[data[i].id] = 1;
              if(data[i].fid != -1){
                     vis[data[i].fid] = 1;
                     Union(data[i].fid, data[i].id);
              }
              if(data[i].mid != -1){
                     vis[data[i].mid] = 1;
                     Union(data[i].id, data[i].mid);
              }
              for(int j = 0; j < k; j++){//
                            //粗心 將j++寫成k++ 導致段錯誤,死循環,運行超時
                            逐行debug
                     scanf("%d",&data[i].cid[j]);
                     vis[data[i].cid[j]] = 1;
                     Union(data[i].id, data[i].cid[j]);
              }
              scanf("%d %d", &data[i].numS,&data[i].area);
       }
       //對data遍歷
       for(int i = 0 ; i < n; i++){
              int id = findFather(data[i].id);
              ans[id].id = id;
              ans[id].area+=data[i].area;
              ans[id].numS+=data[i].numS;
              ans[id].flag = 1;
       }
       int numJT = 0;
       for(int i = 0; i < 10000; i++){
              if(vis[i])
                     ans[findFather(i)].numP++;
              if(ans[i].flag)
                     numJT++;
       }
       for(int i = 0; i < 10000;i++){
              if(ans[i].flag){
                     ans[i].numS = (double)(ans[i].numS *1.0 / ans[i].numP);
                     ans[i].area = (double)(ans[i].area *1.0 / ans[i].numP);
              }
       }
       sort(ans,ans+ 10000,cmp);
       printf("%d\n",numJT);
       for(int i = 0 ; i < numJT; i++){
              printf("%04d %d %.3f %.3f\n", ans[i].id, ans[i].numP, ans[i].numS, ans[i].area);
       }


    //cout << "Hello world!" << endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章