pat 甲级 1034 Head of a Gang

求图的连通分量变形题
看了别人还有很多用并查集的

第一个问题是怎么存储
参考了别人,用map把字符和数字对应起来

第二个问题怎么求
复习之前求连通分量的方法,有几个错误点
dfs循环,主函数循环时 (j=1)
可能对递归还是理解不到位,有死记硬背的嫌疑
接下来就是对连通分量的变形,需要什么变量在递归的过程中求出

其中有三个点
1.求value值的时候 为什么不满足 brr[j] == 0 的也要加在里面
2. 向函数传参时使用&引用,来实现对实参的改变
3. value值加过后该边的值要清零防止死循环

第三个问题输出结果的存储
又用到了map,此时是为了 把三个值串联起来:head string number
为了使 head表示的string 去和 number 联系在一起,所以建立的是 map<string,int>

第四个问题是之前的,map指针输出
之前用的是set 定义指针 set<int>::iterator it
不确定map是不是可以直接推倒,查阅后发现可以 map<string,int>::iterator it
map 输出是 it->first ; it->second

#include <cstdio>
#include <iostream>
#include <map>

using namespace std;

map<string,int> start;
map<int,string> out;
map<string,int> sum;
int idnumber = 1;
int value[2200][2200];
int brr[2200];
int weight[2200];
int n, k;

int inpu(string s){
    if(start[s] == 0){
        start[s] = idnumber;
        out[idnumber] = s;
        return idnumber++;
    }
    else return start[s];
}

void dfs(int i,int &head,int &number, int &total){
    brr[i] = 1;
    number++;
    if(weight[i] > weight[head]) head = i;
    for(int j=1; j<idnumber; j++){

        if(value[i][j] > 0 ){
            total += value[i][j];
            value[i][j] = value[j][i] = 0;
            if(brr[j] == 0)
            dfs(j,head,number,total);
        }
    }

}


int main(){

    scanf("%d %d",&n, &k);
    for(int i=0; i<n; i++){
        string a, b;
        int c;
        cin >> a >> b >> c;
        int id1 = inpu(a);
        int id2 = inpu(b);
        weight[id1] += c;
        weight[id2] += c;
        value[id1][id2] += c;
        value[id2][id1] += c;
    }

    for(int i=1; i<idnumber; i++){
        if(brr[i] == 0){
            int number = 0, total = 0, head = i;
            dfs(i,head,number,total);
            if(number > 2 && total > k) sum[out[head]] = number;
        }
    }

    cout << sum.size() << endl;
    map<string,int>::iterator it;
    for(it = sum.begin(); it != sum.end(); it++)
        cout << it->first << " " << it->second << endl;

    return 0;
}

回家之后写个总结吧,,做了这些题也好几个重复的了,英文标题记不得谁是谁了
落泪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值