PATA1034题解

题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624

参考:算法笔记(胡凡)10.3.1

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
const int N=2*1e3+10;
int n,k,num=0,total=0;
int weight[N]={0},ishead[N],gar[N][N]={0};
bool vis[N]={0};
map<string,int> ma;
map<int,string> mb;
map<int,int> hea;
int stringtoint(string s)
{
    if (ma.find(s)==ma.end())
    {
        ma[s]=num;
        mb[num++]=s;
        return num-1;
    }
    else
    {
        return ma[s];
    }
}
void findmodal(int now,int& head,int& people,int& totwei)
{
    vis[now]=1;
    people++;
    if (weight[now]>weight[head])
    {
        head=now;
    }
    for (int i=0;i<num;i++)
    {
        if (gar[now][i]>0)
        {
            totwei+=gar[now][i];
            gar[i][now]=gar[now][i]=0;
            if (!vis[i])
            {
                findmodal(i,head,people,totwei);
            }
        }
    }
}
int main()
{
//    freopen("in.txt","r",stdin);
    cin>>n>>k;
    string sa,sb;
    int wei;
    for (int i=0;i<n;i++)
    {
        cin>>sa>>sb>>wei;
        int ida=stringtoint(sa);
        int idb=stringtoint(sb);
        weight[ida]+=wei;
        weight[idb]+=wei;
        gar[ida][idb]+=wei;//这里要用+=,不能单单=!
        gar[idb][ida]+=wei;
    }
    for (int i=0;i<num;i++)
    {
        if (vis[i]==0)
        {
            int people=0,head=i,totwei=0;
            findmodal(i,head,people,totwei);
            if (people>2&&totwei>k)
            {
                total++;
                ishead[head]=people;
            }
        }
    }
    cout<<total<<endl;
    map<string,int>::iterator it;
    for (it=ma.begin();it!=ma.end();it++)
    {
        if (ishead[it->second]>0)
        {
            cout<<it->first<<" "<<ishead[it->second]<<endl;
        }
    }

    return 0;
}

  

原文地址:https://www.cnblogs.com/hemeiwolong/p/9967788.html