- 8 59
- AAA BBB 10
- BBB AAA 20
- AAA CCC 40
- DDD EEE 5
- EEE DDD 70
- FFF GGG 30
- GGG HHH 20
- HHH FFF 10
- 2
- AAA 3
- GGG 3
- 8 70
- AAA BBB 10
- BBB AAA 20
- AAA CCC 40
- DDD EEE 5
- EEE DDD 70
- FFF GGG 30
- GGG HHH 20
- HHH FFF 10
0
题目大意
给你一个无向图,假设可以互相抵达的点为一个集群;每个点的权重为其所连边长总和,求权重总和超过limit且点数大于二的集群数量,以及每个集群中,权重最高的那个点
思路
BFS搜索每一个未被搜索过的点
- #include
- using namespace std;
- map
> nums; // 互相有关系的人 - map
int> keys; // 该人通话的总权值 - map
bool> apr; // 判断该人是否查询过 - set
all; - int N,limit,key,number;
- string a,b,idKey;
- int findUnion(const string& now);
- int main()
- {
- cin >> N >> limit;
- while (N--){
- cin >> a >> b >> key;
- keys[a]+=key;
- keys[b]+=key;
- nums[a].push_back(b);
- nums[b].push_back(a);
- all.insert(a);
- all.insert(b);
- }
- limit*=2;
- set
int>> result; - for(const string& x:all){
- if(apr[x]) continue;
- idKey = x;
- number = 0;
- int flag = findUnion(x);
- // cout << flag << endl;
- if(flag>limit && number>2) result.insert({idKey,number});
- }
- cout << result.size() << endl;
- for(const auto& x:result) cout << x.first << " " << x.second << endl;
- return 0;
- }
- int findUnion(const string& now){
- if(apr[now]) return 0;
- apr[now] = true;
- number++;
- if(keys[now]>keys[idKey]) idKey = now;
- int sum = keys[now];
- for(const string& x:nums[now]) sum += findUnion(x);
- return sum;
- }
