PAT甲级-1034 Head of a Gang

news2024/10/24 11:48:49

题目

题目大意

一个犯罪团伙满足条件:人数 > 2;团伙内的总通话时长 > k。团伙首领就是该团伙中通话时长最多的。先给定一组通话,格式为 A B time,要求输出犯罪团伙的数目,并输出每个团伙的首领名字和该团伙的人数。如果没有犯罪团伙,就输出0。

思路

大致的思路并不难,但是有许多细节的坑点。求犯罪团伙的数量就是求图的连通分量,确定了这一点后,再考虑图的存储。

该题和别的题不同,不是给下标,而是给名字,并且还有权值,就不能用二维string数组了,只能用邻接表,但邻接表又对应下标。因此需要建立一个从名字到下标的映射,就用map了,既方便图的构建,又方便后续由下标找名字的操作(当然,也可以再建一个从下标到名字的map,后面找名字会更加方便,但是我有点懒没有弄hhh)。

构建图还需要注意一点,就是A给B通话20,B给A通话10,那么A到B和B到A的权值都是30。(这点我调试的时候才发现)

求连通分量的数目用dfs,很经典了。刚开始我在里面加了计算每个连通分量总通话时长的代码,但由于连通分量有可能是环,用dfs会少加一条边,所以就把计算total挪到dfs后面了。找到连通分量后再算这个分量的总权值,为防止重复,加过一条边就把这条边的权值设为0。

找到犯罪团伙的首领后,还需要按照人名的字典序输出,否则测试点2、5错误。所以我又加了个map,map可以自动排序。

测试点3段错误是因为开的数组太小了,无向图最好开到2 * n + 1。

代码

#include <iostream>
#include <vector>
#include <map>
using namespace std;

int n, m;  // 这里我把k换成m了
int g[2001][2001];  // 刚开始开的1001,测试点3段错误,无向图最好开到2*n + 1
map<string, int> mp;  // 名字-下标
map<int, int> res;  // 存储各个连通分量的犯罪首领及团伙人数
bool b[2001] = {false};
vector<int> team;  // 记录每个连通分量的成员
int total = 0;  // 连通分量的总权值

void dfs(int vi){
    b[vi] = true;
    team.push_back(vi);
    for (int i = 1; i <= n; i++){
        if (!b[i] && g[vi][i]){
            dfs(i);
        }
    }
}

int main(){
    cin >> n >> m;
    int temp = 1;  // 记录名字的下标
    for (int i = 0; i < n; i++){
        string v1, v2;
        int time;
        cin >> v1 >> v2 >> time;
        if (i == 0){
            mp[v1] = temp;
            temp++;
            mp[v2] = temp;
            temp++;
        }else{
            int flag1 = 0, flag2 = 0;  // 标记有没有在mp中找到v1,v2
            for (auto it = mp.begin(); it != mp.end(); it++){
                if (v1 == it->first){
                    flag1 = 1;
                }
                if (v2 == it->first){
                    flag2 = 1;
                }
            }
            if (!flag1){
                mp[v1] = temp;
                temp++;
            }
            if (!flag2){
                mp[v2] = temp;
                temp++;
            }
        }
        if (g[mp[v1]][mp[v2]]){
            g[mp[v1]][mp[v2]] += time;
            g[mp[v2]][mp[v1]] += time;
        }else{
            g[mp[v1]][mp[v2]] = g[mp[v2]][mp[v1]] = time;
        }
    }  // 构建图

    for (int i = 1; i <= n; i++){
        if (!b[i]){
            team.clear();
            total = 0;
            dfs(i);
            if ((int)team.size() > 2){
                for (int j = 0; j < (int)team.size(); j++){
                    for (int k = 0; k != j && k < (int)team.size(); k++){
                        total += g[team[j]][team[k]];
                        g[team[j]][team[k]] = 0;  // 加过的边直接设为0
                    }
                }
            }  // 如果是环,total无法在dfs中计算,所以要另外计算total

            if ((int)team.size() > 2 && total > m){
                int maxTime = 0, head;
                for (int j = 0; j < (int)team.size(); j++){
                    int sum = 0;
                    for (int k = 1; k <= n; k++){
                        if (g[team[j]][k]){
                            sum += g[team[j]][k];
                        }
                        if (g[k][team[j]]){
                            sum += g[k][team[j]];
                        }
                    }
                    if (maxTime < sum){
                        maxTime = sum;
                        head = team[j];
                    }
                }  // 找犯罪团伙的首领
                res[head] = (int)team.size();
            }
        }
    }

    if (res.size() == 0){
        cout << "0" << endl;
    }else{
        cout << res.size() << endl;
        map<string, int> result;  // 题目要求犯罪首领输出按字典序(测试点2、5)
        for (auto i = res.begin(); i != res.end(); i++){
            for (auto j = mp.begin(); j != mp.end(); j++){
                if (i->first == j->second){
                    result[j->first] = i->second;
                    break;
                }
            }
        }
        for (auto it = result.begin(); it != result.end(); it++){
            cout << it->first << " " << it->second << endl;
        }
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文详解数据库范式

背景 在开发中&#xff0c;我们经常需要考虑如何设计合适的表结构&#xff0c;而则往往需要考虑数据库的范式。数据库的三范式&#xff08;3NF&#xff09;是数据库设计过程中用来减少数据冗余和提高数据一致性的重要规则。它们分别是第一范式&#xff08;1NF&#xff09;、第二…

【PR小技巧】PR技术分享 一 PR关键帧小技巧介绍

在Adobe Premiere Pro (简称PR) 中&#xff0c;关键帧是用于控制视频剪辑、音频轨道、效果动画等随时间变化的重要工具。通过合理使用关键帧&#xff0c;可以实现各种复杂的动画效果和精确的时间控制。今天我们就来学习一些关于关键帧的小技巧&#xff0c;以及具体的例子来说明…

算法专题五: 位运算

目录 常见位运算总结1. 位1的个数2. 比特位计数3. 汉明距离4. 只出现一次的数字5. 只出现一次的数字Ⅲ6. 判定字符是否唯一7. 丢失的数字8. 两正数之和9. 只出现一次的数字Ⅲ10. 消失的两个数字 常见位运算总结 重点 : 1. 位1的个数 算法思路: 这道题就用到了我们总结的那个第…

全新YOLOv11美化版检测界面 涵盖超多功能 支持百种模型改进训练

文章目录 前言视频效果必要环境一、界面功能概述1. 运行方法2. 图像选择图像:表格信息:统计信息:IOU和NMS调节:目标框显示: 3. 文件夹选择文件夹:进度显示:推理结果: 4. 视频、摄像头进度显示:实时检测:帧状态回溯: 5. 替换界面中的模型5. 鼠标悬浮 二、训练改进模型运行方法假…

力扣周赛:第419场周赛

&#x1f468;‍&#x1f393;作者简介&#xff1a;爱好技术和算法的研究生 &#x1f30c;上期文章&#xff1a;力扣周赛&#xff1a;第415场周赛 &#x1f4da;订阅专栏&#xff1a;力扣周赛 希望文章对你们有所帮助 因为一些特殊原因&#xff0c;这场比赛就打了1h&#xff0c…

[Linux] Linux 模拟实现 Shell

标题&#xff1a;[Linux] Linux 模拟实现 Shell 个人主页水墨不写bug&#xff08;图片来源于网络&#xff09; 目录 一、什么是shell 二、shell的理解 三、模拟实现shell 1&#xff09;打印命令行提示 2&#xff09;获取用户的输入字符串 3&#xff09;分割命令字符串 4…

【优选算法篇】双指针的优雅舞步:C++ 算法世界的浪漫探索

文章目录 C 双指针详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;对撞指针1.1 移动零解题思路图解分析C代码实现易错点提示代码解读 1.2 复写零解题思路算法步骤C代码实现易错点提示代码复杂度 1.3 盛最多水的容器1. 题目链接2. 题目描述解法一&#xff08;暴力求解…

链表(4)_合并K个升序链表_面试题

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 链表(4)_合并K个升序链表_面试题 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录…

第十五届蓝桥杯C++B组省赛

文章目录 1.握手问题解题思路1&#xff08;组合数学&#xff09;解题思路2&#xff08;暴力枚举&#xff09; 2.小球反弹做题思路 3.好数算法思路&#xff08;暴力解法&#xff09;---不会超时 4.R格式算法思路 5.宝石组合算法思路---唯一分解定理 6.数字接龙算法思路----DFS 7…

【Oracle数据库进阶】001.SQL基础查询_查询语句

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

Egg考古系列-EggCore的生命周期

关于EGG egg框架的第一个版本还是2017-03-21&#xff0c;距今已有7年了。虽然最近几年没有什么更新&#xff0c;但它在国内的使用还是挺多的&#xff0c;mvc的分层模式也很受大家喜欢。虽然声称是面向企业级、中大型项目场景的框架&#xff0c;但这种约定式在大型项目中其实也很…

高校学科竞赛管理:SpringBoot实现的高效策略

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【M2-Mixer】核心方法解读

abstract&#xff1a; 在本文中&#xff0c;我们提出了M2-Mixer&#xff0c;这是一种基于MLPMixer的结构&#xff0c;具有多头损失&#xff0c;用于多模态分类。它比基于卷积、循环或神经结构搜索的基线模型具有更好的性能&#xff0c;其主要优势是概念和计算简单。所提出的多…

【电子电力】LCL滤波器设计,包括电流控制调谐

摘要 LCL 滤波器是电力电子领域中广泛应用于并网逆变器的滤波器之一&#xff0c;其主要功能是减少高频开关的谐波&#xff0c;确保输出电流的质量。本文设计并实现了基于 MATLAB 的 LCL 滤波器模型&#xff0c;结合电流控制器和调谐技术&#xff0c;验证了其在谐波抑制方面的效…

从RNN讲起(RNN、LSTM、GRU、BiGRU)——序列数据处理网络

文章目录 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;1. 什么是RNN&#xff1f;2. 经典RNN的结构3. RNN的主要特点4. RNN存在问题——长期依赖&#xff08;Long-TermDependencies&#xff09;问题 LSTM&#xff08;Long Short-Term Memory&a…

PostgreSQL学习笔记七:常规SQL操作

PostgreSQL 支持标准的 SQL 语句&#xff0c;同时也扩展了一些特有的功能。以下是一些常规的 SQL 语句示例&#xff0c;这些示例涵盖了数据定义、数据操作和数据查询的基本操作&#xff1a; 数据定义语言 (DDL 创建数据库&#xff1a; CREATE DATABASE mydatabase;创建表&#…

stm32单片机个人学习笔记9(TIM输入捕获)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

AWD入门

一、简介 AWD(Attack With Defense&#xff0c;攻防兼备)模式。你需要在一场比赛里要扮演攻击方和防守方&#xff0c;攻者得分&#xff0c;失守者会被扣分。也就是说攻击别人的靶机可以获取 Flag 分数时&#xff0c;别人会被扣分&#xff0c;同时你也要保护自己的主机不被别人…

Docker 教程四 (Docker 镜像加速)

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难&#xff0c;此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题&#xff0c;基本不能用了&#xff0c;后期能用我再更新下。* Docker 官方和国内很多云服务商都提供了国内加速器服务&#xff0c;例如…

Python网络爬虫入门指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…