zoukankan      html  css  js  c++  java
  • 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
    ");
        }
    }
    
  • 相关阅读:
    基于摸板匹配的目標跟蹤算法
    spoj 2713 Can you answer these queries IV
    zoj 3633 Alice's present
    hdu 3642 Get The Treasury
    poj 1195 Mobile phones
    poj 2760 End of Windless Days
    zoj 3540 Adding New Machine
    spoj 1716 Can you answer these queries III
    spoj 1043 Can you answer these queries I
    spoj 2916 Can you answer these queries V
  • 原文地址:https://www.cnblogs.com/Alruddy/p/7571550.html
Copyright © 2011-2022 走看看