题中的n为n对,maxn要开到2010;

利用map映射的方法,将字符串转化为数字,将数字转化为字符串

再通过DFS,或BFS遍历,记录满足条件的Gang即可

DFS版:

//
//  main.cpp
//  PATA1034
//
//  Created by Phoenix on 2018/1/17.
//  Copyright © 2018年 Phoenix. All rights reserved.
//#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
const int maxn=2010;
int n,k,numperson=0;
int G[maxn][maxn]={0},weight[maxn]={0};
bool vis[maxn]={false};map<int,string> intTostring;
map<string,int> stringToint;
map<string,int> Gang;void DFS(int nowVisit,int& head,int& numMember,int& totalValue){//printf("%d\n",nowVisit);numMember++;vis[nowVisit]=true;if(weight[nowVisit]>weight[head]){head=nowVisit;}for(int i=0;i<numperson;i++){if(G[nowVisit][i]>0){totalValue += G[nowVisit][i];G[nowVisit][i]=G[i][nowVisit]=0;if(vis[i]==false){DFS(i, head, numMember, totalValue);}}}
}void DFSTrave(){for(int i=0;i<numperson;i++){if(vis[i]==false){int head=i,numMember=0,totalValue=0;DFS(i,head,numMember,totalValue);if(numMember>2&&totalValue>k){Gang[intTostring[head]]=numMember;//printf("%d %d\n\n",head,numMember);}}}
}int change(string str){if(stringToint.find(str)!=stringToint.end())return stringToint[str];else{stringToint[str]=numperson;intTostring[numperson]=str;return numperson++;}
}int main(int argc, const char * argv[]) {scanf("%d %d",&n,&k);//printf("%d %d\n",n,k);for(int i=0;i<n;i++){string str1,str2;int w;cin>>str1>>str2>>w;int id1=change(str1);int id2=change(str2);//printf("%d %d %d\n",id1,id2,w);weight[id1] += w;weight[id2] += w;G[id1][id2] += w;G[id2][id1] += w;}DFSTrave();cout<<Gang.size()<<endl;map<string,int>::iterator it;for(it=Gang.begin();it!=Gang.end();it++){cout<<it->first<<" "<<it->second<<endl;}return 0;
}

BFS版:

//
//  main.cpp
//  PATA1034
//
//  Created by Phoenix on 2018/2/10.
//  Copyright © 2018年 Phoenix. All rights reserved.
//#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
const int maxn = 2010;
int n, k, num = 0;
bool vis[maxn] = {false};
map<string, int> mp;
map<int, string> mp1;struct node {int data;int num;vector<int> v;
}node[maxn];vector<int> v1;
void BFS(int v) {queue<int> q;int ans = 0, t = 0, optvalue = 0, name;q.push(v);vis[v] = true;while(!q.empty()) {int top = q.front();//printf("%d ", top);q.pop();t++;ans += node[top].data;if(node[top].data > optvalue) {optvalue = node[top].data;name = top;}for(int i = 0; i < node[top].v.size(); i++) {if(vis[node[top].v[i]] == false){q.push(node[top].v[i]);vis[node[top].v[i]] = true;}}}ans /= 2;if(t > 2 && ans > k) {v1.push_back(name);node[name].num = t;}//printf(" %d %d\n", t, ans);
}void travelBFS() {for(int i = 0; i < num; i++) {if(vis[i] == false){BFS(i);}}
}bool cmp(int a, int b) {string str1 = mp1[a];string str2 = mp1[b];return str1 < str2;
}int main(int argc, const char * argv[]) {scanf("%d %d", &n, &k);for(int i = 0; i < n; i++) {string str1, str2;int time, name1, name2;char a[4], b[4];cin >> a >> b >> time;str1 = a; str2 = b;if(mp.find(str1) == mp.end()) {mp[str1] = num++;}name1 = mp[str1];mp1[name1] = str1;if(mp.find(str2) == mp.end()) {mp[str2] = num++;}name2 = mp[str2];mp1[name2] = str2;node[name1].data += time;node[name2].data += time;node[name1].v.push_back(name2);node[name2].v.push_back(name1);}travelBFS();printf("%d\n", v1.size());sort(v1.begin(), v1.end(), cmp);for(int i = 0; i < v1.size(); i++) {map<int, string>::iterator it = mp1.find(v1[i]);cout << it->second << " " << node[v1[i]].num << endl;}return 0;
}

PATA1034题解相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  4. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  5. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

  10. 第五届合肥工业大学宣城校区程序设计大赛题解

    问题 A: 小问题 时间限制: 1 Sec  内存限制: 128 MB  Special Judge 题目描述 林喵喵特别喜欢解决女孩子们提出的问题. 于是, 有一天殷老师问了林喵喵一个小问题. 给出 ...

最新文章

  1. Redux学习(2) ----- 异步和中间件
  2. 最后一期:如何更新LSTM模型?(附代码)| 博士带你学LSTM
  3. c语言x的2取模_c语言如何取模运算
  4. 中国数据中心市场时评—简析全国数据中心布局情况
  5. 【Github上有趣的项目】TensorKart 自动驾驶马里奥赛车(玩不了)
  6. DVWA---文件包含
  7. 机器学习导论(张志华):条件期望
  8. Java 8 - Interface Default Method接口默认方法
  9. python库有什么用_Python程序员必知什么 常用的Python库有哪些
  10. kali 邮箱攻击_kali下邮件发送工具swaks入坑
  11. 2016版系统集成项目管理工程师下午案例分析考试范围
  12. Android开发之 Android 的基本组件的概述
  13. 虚拟机上的linux里安装ngnix,虚拟机(linux)下安装nginx的步骤教程
  14. 家庭理财系统 -- 功能清单
  15. Android报警功能,报警铃音,手机开始震动
  16. 线性代数之——复数矩阵
  17. EXCEL表格-COUNTIF函数查找数据重复项
  18. 科研过程中Linux相关问题
  19. snap telemetry-Intel 网络遥测框架简介
  20. 循环冗余校验(CRC)之verilog实现

热门文章

  1. Java手机游戏新流星蝴蝶剑,网页最好玩的游戏
  2. vue遍历中key详解 (Demo案例)
  3. kettle 6.1.0.1 mysql_kettle连接数据库报错:Error occured while trying to connect
  4. 个人公众号注销方法_微信公众号注销后可以再申请吗 公众号注销帐号方法介绍...
  5. kibana Percentile Ranks计算的逻辑
  6. [uboot]What is MLO file?
  7. Python OS模块操作文件目录
  8. 七夕节,我用代码制作了表白信封
  9. linux 实现不同网段网络互通
  10. java 中文大写金额_金额数字转中文大写