zoukankan      html  css  js  c++  java
  • 题目1446:Head of a Gang(并查集操作)

    题目链接:http://ac.jobdu.com/problem.php?pid=1446

    详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus

    参考代码:

    //
    //  1446 Head of a Gang.cpp
    //  Jobdu
    //
    //  Created by PengFei_Zheng on 17/04/2017.
    //  Copyright © 2017 PengFei_Zheng. All rights reserved.
    //
     
    #include <stdio.h>
    #include <map>
    #include <vector>
    #include <string>
    #include <string.h>
    #include <algorithm>
    #include <list>
    #define maxn 1010
    using namespace std;
     
    int parent[maxn];
    int n, k, i;
    int currNum;
    map<string, int> baseMap;
     
    char marray[maxn][4];
    char resultArr[maxn][4];
    int callTime[maxn];
    int singleCallTime[maxn];
    int fatherArr[maxn];
    int visit[maxn];
     
    struct Node {
        char name[4];
        int size;
    } nodes[maxn];
     
    //并查集寻找父亲节点
    int findRoot(int x) {
        while (parent[x] != x) {
            x = parent[x];
        }
        return x;
    }
     
    //并查集合并节点
    void unionSet(int a, int b) {
         
        a = findRoot(a);
        b = findRoot(b);
        if (a == b) return;
        if (a > b) {
            parent[a] = b;
        } else {
            parent[b] = a;
        }
    }
     
    //初始化基本数据,这在以后会用到
    void initData() {
        baseMap.clear();
        memset(callTime, 0, sizeof(callTime));
        memset(visit, 0, sizeof(visit));
        memset(singleCallTime, 0, sizeof(singleCallTime));
        memset(fatherArr, 0, sizeof(fatherArr));
        for (i = 1; i < maxn; i++) {
            parent[i] = i;
        }
    }
     
    //将字符串转为数字,否则后面不太好处理
    int getCurrentNum(char c[]) {
        int num = 0;
        map<string, int>::iterator it = baseMap.find(c);
        if (it == baseMap.end()) {
            currNum++;
            num = currNum;
            baseMap.insert(make_pair(c, num));
        } else {
            num = it->second;
        }
        return num;
    }
     
    //记录每个人打电话的时间
    void constructData(char a[], char b[], int anum, int bnum, int d) {
        if (singleCallTime[anum] == 0) {
            singleCallTime[anum] = d;
        } else {
            singleCallTime[anum] += d;
        }
        strcpy(marray[anum], a);
        strcpy(marray[bnum], b);
        callTime[anum] += d;
        callTime[bnum] += d;
    }
     
    bool cmp(Node node1, Node node2) {
        return strcmp(node1.name, node2.name) < 0;
    }
     
    int main() {
        while (scanf("%d%d", &n, &k) != EOF) {
            initData();
            currNum = 0;
            char a[4];
            char b[4];
            int d;
            for (i = 0; i < n; i++) {
                scanf("%s%s%d", a, b, &d);
                int anum = getCurrentNum(a);
                int bnum = getCurrentNum(b);
                constructData(a, b, anum, bnum, d);
                unionSet(anum, bnum);
            }
             
            int tmpk = 1;
            for (i = 1; i < currNum + 1; i++) {
                parent[i] = findRoot(i);
                if (parent[i] == i) {
                    fatherArr[tmpk] = i;
                    tmpk++;
                }
            }
            int num = 0;
            for (i = 1; i < tmpk; i++) {
                int size = 0;
                int allTime = 0;
                int maxTime = -1;
                int maxMem = 0;
                for (int j = 1; j < currNum + 1; j++) {
                    if (fatherArr[i] != 0 && visit[j] == 0) {
                        if (parent[j] == fatherArr[i]) {
                            size++;
                            allTime += singleCallTime[j];
                            if (callTime[j] > maxTime) {
                                maxTime = callTime[j];
                                maxMem = j;
                            }
                            visit[j] = 1;
                        }
                    }
                }
                if (size < 3) {
                    continue;
                }
                if (allTime <= k) {
                    continue;
                }
                strcpy(nodes[num].name, marray[maxMem]);
                nodes[num].size = size;
                num++;
            }
            sort(nodes, nodes + num, cmp);
            printf("%d
    ", num);
            for (i = 0; i < num; i++) {
                printf("%s %d
    ", nodes[i].name, nodes[i].size);
            }
             
        }
        return 0;
    }
     
    /**************************************************************
        Problem: 1446
        User: zpfbuaa
        Language: C++
        Result: Accepted
        Time:30 ms
        Memory:1096 kb
    ****************************************************************/
  • 相关阅读:
    Java之美[从菜鸟到高手演变]之设计模式
    Akka边学边写(1)-- Hello, World!
    [D3 + AngularJS] 15. Create a D3 Chart as an Angular Directive
    [D3] 14. Line and Area Charts with D3
    [D3] 13. Cleaner D3 code with selection.call()
    [D3] 12. Basic Transitions with D3
    [D3] 9. Scatter Plot
    [D3] 8. Margins
    [D3] 7. Quantitative Scales
    Runoob-Java-高级教程-实例-字符串:09. Java 实例
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/6728450.html
Copyright © 2011-2022 走看看