浙江大学PAT甲级A1034(C++)题解

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
//struct Gang{
//    int head;
//    int numMember;
//}arrayGang[2010];
//bool cmp(Gang a,Gang b){
//    return a.head<b.head;
//}
map<string,int> Gang;
map<string,int> m;
map<int,string> n;
bool visit[2010]={false};
//保存     点权值
int weight[2010]={0};
//邻接矩阵  保存边权
int G[2010][2010];
int N,K;
//总人数
int numPerson =0;
void DFS(int nowVisit,int& head,int& numMember,int& totalWeight){
    //人数累加1
    numMember++;
    //标记已经访问当前结点
    visit[nowVisit] = true;
    if(weight[nowVisit]>weight[head]){
        head = nowVisit;
    }

    for(int i=0 ;i<numPerson;i++){
        //如果有边才继续DFS
        if(G[nowVisit][i]>0){
            //累加总权
            totalWeight = totalWeight + G[nowVisit][i];
            G[nowVisit][i] = G[i][nowVisit] = 0;//删除边 防止回头
            if(visit[i]== false){
                DFS(i,head,numMember,totalWeight);
            }
        }
    }

}
int index =0;
int sum = 0;
void DFSTrave(){
    for(int i=0;i<numPerson ;i++){
        if(visit[i]==false){
            int head = i,numMember =0,totalValue =0;
            DFS(i,head,numMember,totalValue);
            if(numMember>2&&totalValue>K){
                Gang[n[head]] = numMember;
            }
        }
    }
}

int strToNum(string str){
    if(m.find(str)!=m.end()){
        return m[str];
    } else{
        m[str] = numPerson;
        n[numPerson] = str;
        return numPerson++;
    }
}
int main() {
    int w ;
    string str1,str2;
    cin>>N>>K;
    for(int i =0;i<N;i++){
        cin>>str1>>str2>>w;
        int id1 = strToNum(str1);
        int id2 = strToNum(str2);
        weight[id1]+=w;
        weight[id2]+=w;
        G[id1][id2]+=w;
        G[id2][id1]+=w;
    }
//    cout<<numPerson<<endl;
    DFSTrave();
//    sort(arrayGang,arrayGang+sum,cmp);
    cout<<Gang.size()<<endl;
    for(auto it:Gang){
           cout<<it.first<<" "<<it.second<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值