PAT A 1034

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
/*输入处理,输入n,k,接下来n行,将string转换成int,将点权累加,构建邻接矩阵,
编写change函数,使用map,若map当前没有此字符串,则加入,若有则直接返回对应的编号
遍历图,对每个块进行处理,若人数大于2,总权值大于k,将头目和对应的人数存到map中
如何遍历某个块并求出该块的总边权,总点权/2可以否?
*/
#define maxn 2020
int G[maxn][maxn]={0};
int n,k;
int index;
bool vis[maxn]={false};
int vpower[maxn]={0};
map<string,int>strtoint;
map<int,string>inttostr;
map<string,int>boss;
int change(string str)
{
    if(strtoint.find(str)==strtoint.end()){//不在map中
        inttostr[index]=str;
        return strtoint[str]=index++;
    }
    else{
        return strtoint[str];
    }
}
void DFS(int nowVisit,int &head,int &numMember,int &totalvalue)
{
    totalvalue+=vpower[nowVisit]/2;
    numMember++;
    if(vpower[nowVisit]>vpower[head]){
        head=nowVisit;
    }
    vis[nowVisit]=true;
    for(int i=0;i<index;i++){
        if(vis[i]==false&&G[nowVisit][i]!=0){
            DFS(i,head,numMember,totalvalue);
        }
    }
}
void DFSG()
{
    for(int i=0;i<index;i++){
        if(vis[i]==false){
            int head=i,numMember=0,totalvalue=0;
            DFS(i,head,numMember,totalvalue);
            if(numMember>2&&totalvalue>k){
                boss[inttostr[head]]=numMember;
            }
        }
    }
}
int main()
{
    scanf("%d %d",&n,&k);
    for(int i=0;i<n;i++){
        string str1,str2;
        int t;
        cin>>str1>>str2>>t;
        int m=change(str1);
        int n=change(str2);
        vpower[m]+=t;
        vpower[n]+=t;
        G[m][n]+=t;
        G[n][m]+=t;
    }
    DFSG();
    if(boss.size()==0){
        printf("0\n");
    }
    else{
        printf("%d\n",boss.size());
        for(map<string,int>::iterator it=boss.begin();it!=boss.end();it++){
            cout<<it->first<<' '<<it->second<<endl;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值