zoukankan      html  css  js  c++  java
  • A1114 Family Property [并查集]

    在这里插入图片描述
    唉 自己没想出来 二刷再来看吧

    #include<iostream>
    #include<vector>
    #include<map>
    #include<string>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct Data
    {
    	int id, fid, mid, estate, area;
    	int cid[10];
    }dt[1005];
    struct node
    {
    	int id, people;
    	double estate, area;
    	bool flag = false;
    }ans[10000];
    int father[10000];
    bool visit[10000];
    int find(int x)
    {
    	while (x != father[x])
    		x = father[x];
    	return x;
    }
    
    void Union(int a, int b)
    {
    	int faA = find(a);
    	int faB = find(b);
    	if (faA > faB)
    		father[faA] = faB;
    	else if (faA < faB)
    		father[faB] = faA;
    }
    
    int cmp(node a, node b)
    {
    	if (a.area != b.area)
    		return a.area > b.area;
    	else
    		return a.id < b.id;
    }
    
    int main()
    {
    	int n, k, cnt = 0;
    	cin >> n;
    	for (int i = 0; i < 10000; i++)
    		father[i] = i;
    	for (int i = 0; i < n; i++)
    	{
    		cin >> dt[i].id >> dt[i].fid >> dt[i].mid >> k;
    		visit[dt[i].id] = true;
    		if (dt[i].fid != -1)
    		{
    			visit[dt[i].fid] = true;
    			Union(dt[i].fid, dt[i].id);
    		}
    		if (dt[i].mid != -1)
    		{
    			visit[dt[i].mid] = true;
    			Union(dt[i].mid, dt[i].id);
    		}
    		for (int j = 0; j < k; j++)
    		{
    			cin >> dt[i].cid[j];
    			visit[dt[i].cid[j]] = true;
    			Union(dt[i].cid[j], dt[i].id);
    		}
    		cin >> dt[i].estate>> dt[i].area;
    	}
    	for (int i = 0; i < n; i++)
    	{
    		int id = find(dt[i].id);
    		ans[id].id = id;
    		ans[id].estate += dt[i].estate;
    		ans[id].area += dt[i].area;
    		ans[id].flag = true;
    	}
    	
    	for (int i = 0; i < 10000; i++)
    	{
    		if(visit[i])
    			ans[find(i)].people++;
    		if (ans[i].flag)
    			cnt++;
    	}
    	for (int i = 0; i < 10000; i++)
    	{
    		if (ans[i].flag)
    		{
    			ans[i].estate = ans[i].estate / ans[i].people;
    			ans[i].area = ans[i].area / ans[i].people;
    		}
    	}
    	sort(ans, ans + 10000, cmp);
    	printf("%d
    ", cnt);
    	for (int i = 0; i < cnt; i++)
    		printf("%04d %d %.3f %.3f
    ", ans[i].id, ans[i].people, ans[i].estate, ans[i].area);
    	return 0;
    
    }
    
  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13811975.html
Copyright © 2011-2022 走看看