• LightOJ 1263


    题目链接


    题意: 有n个人,每个人一开始有一定量的钱,之后给了m个关系,每个关系表明两个人可以有金钱的流通,问最后是否可以让每个人的钱都一样。

    思路:并查集解决,将可以相互流通金钱的人放在一个集合中,记录集合的人数和集合中的钱的总数,判断每个集合时候金钱可平分,并且每人平均的金钱就是最后的答案的平分金额。


    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <vector>
    #include <algorithm>
    #include <queue>
    #include <map>
    #include <stack>
    #include <string>
    #include <math.h>
    #include <bitset>
    #include <ctype.h>
    using namespace std;
    typedef pair<int,int> P;
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    const double PI = acos(-1.0);
    const double eps = 1e-9;
    const int N = 1e5 + 5;
    const int mod = 1e9 + 7;
    int t,kase = 0;
    int a[N],fa[N],sum[N],num[N];
    void init(int n)
    {
        for(int i = 1; i <= n; i++)
        {
            fa[i] = i;
            sum[i] = a[i];
            num[i] = 1;
        }
    }
    int find(int x)
    {
        if(x == fa[x]) return x;
        return fa[x] = find(fa[x]);
    }
    bool Union(int xx, int yy)
    {
        int x = find(xx);
        int y = find(yy);
        if(x == y) return false;
        num[x] += num[y];
        sum[x] += sum[y];
        fa[y] = x;
        return true;
    }
    int n,m,u,v;
    int main()
    {
        scanf("%d", &t);
        while(t--)
        {
            int Sum = 0;
            scanf("%d%d", &n, &m);
            for(int i = 1; i <= n; i++)
            {
                scanf("%d", &a[i]);
                Sum += a[i];
            }
            init(n);
            for(int i = 0; i < m; i++)
            {
                scanf("%d%d", &u, &v);
                Union(u,v);
            }
            printf("Case %d: ", ++kase);
            if(Sum%n != 0)
            {
                printf("No
    ");
                continue;
            }
            int tmp = Sum/n, flag = 1;
            for(int i = 1; i <= n; i++)
            {
                if(fa[i] == i && (sum[i]%num[i] != 0 || sum[i]/num[i] != tmp))
                {
                    flag = 0;
                    break;
                }
            }
            if(flag)
                printf("Yes
    ");
            else
                printf("No
    ");
        }
    }
    
  • 相关阅读:
    VS2013快速安装教程
    软件工程课程的感想
    GitHub和Microsoft TFS对比有什么优势
    拼接素数
    C语言程序题
    vue中的实例方法的底层原理
    ios 安卓
    防抖
    伪数组转真数组的放法
    http和https的一种能力?
  • 原文地址:https://www.cnblogs.com/Alruddy/p/7571550.html
Copyright © 2020-2023  润新知