pat 1034 Head of a Gang (30分)

#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
#include<vector>

using namespace std;

int cnt;
map<string,int> ma1;
map<int, string> ma2;

const int N = 10005;
int fa[N]; 
int n, k;
int w[N];
int num[N];
int ew[N];
bool st[N];
void init()
{
    for (int i = 0 ; i < N; i++)
    {
        fa[i] = i;
        num[i] = 1;
        ew[i] = 0;
    }
}
int find(int a)
{
    if (fa[a] == a) return a;
    else return fa[a] = find(fa[a]);
}

void unite(int a, int b, int ti)
{
    int f1 = find(a);
    int f2 = find(b);
    if (f1 != f2)
    {
        fa[f2] = f1;
        num[f1] += num[f2];
        ew[f1] += ew[f2] + ti;
    }
}
int main()
{
    cin >> n >> k;
    init();
    for (int i = 1; i <= n; i++)
    {
        string a, b; int ti;
        cin >> a >> b>> ti;
        if (ma1.count(a) == 0) ma1[a] = ++cnt,ma2[cnt] = a;
        if (ma1.count(b) == 0) ma1[b] = ++cnt,ma2[cnt] = b;
        int x = ma1[a], y = ma1[b];
        w[x] += ti, w[y] += ti;
        if (find(x) != find(y))
        {
            unite(x, y, ti);
        }
        else ew[find(x)] += ti;
    }

    map<int,set<pair<int,int> > > ma3;
    for (int i = 1; i <= 2*n; i++)
    {
        int x = find(i);
        if (num[x] > 2 && ew[x] > k)
            ma3[x].insert({w[i], i});
    }
    vector<string > vec;
    
    for (auto &i : ma3)
    {
        vec.push_back(ma2[(*i.second.rbegin()).second]);
    }
    
    sort(vec.begin(), vec.end());
    int len = vec.size();
    cout << len << endl;
    for (int i = 0; i < len; i++)
    {
        cout << vec[i]<< " " << num[find(ma1[vec[i]]) ]<<endl;
    }
}

 

posted @ 2020-12-04 14:48  hulian425  阅读(39)  评论(0编辑  收藏  举报