PAT甲级 1034(C++)

该博客主要介绍了PAT甲级编程竞赛中的一道题目,涉及图的深度优先遍历(DFS)算法。通过输入的成员关系,计算各成员的影响力,并找出可能的团伙头目。程序首先建立节点关系,然后通过DFS遍历寻找具有超过两人直接或间接关系的团伙,当团伙内关系总和大于给定阈值时,记录该团伙头目。最终输出可能的团伙头目数量及其影响力计数。
摘要由CSDN通过智能技术生成

代码参考:1034. Head of a Gang (30)-PAT甲级真题(图的遍历dfs)_柳婼 の blog-CSDN博客

#include<iostream>
#include<map>
#include<vector>
using namespace std;
int N, K;
map<string, int> sToi;
map<int, string> iTos;
int number = 1;
int relation[2001][2001] = { 0 };
int tt[2001] = { 0 };
int c = 1;
int isvisited[2001] = { 0 };
vector<int>ans;
map<string, int> result;
int getIndex(string in) {
	if (sToi[in] == 0) {
		sToi[in] = number;
		iTos[number] = in;
		number++;
	}
	return sToi[in];
}
void dfs(int i) {
	for (int j = 1; j <= sToi.size(); j++) {
		if (relation[i][j] !=0 && isvisited[j]==0) {
			c++; isvisited[j] = 1; 
			ans.push_back(j); 
			dfs(j);
		}
	}
}
int main() {
	cin >> N >> K;
	for (int i = 1; i <= N; i++) {
		string a, b; int t;
		cin >> a >> b >> t;
		int index1 = getIndex(a);
		int index2 = getIndex(b);
		tt[index1] += t;
		tt[index2] += t;
		relation[index1][index2] += t;
		relation[index2][index1] += t;
	}
	for (int i = 1; i <= sToi.size(); i++) {
		if (isvisited[i] == 0) {
			isvisited[i] = 1;
			ans.clear();
			ans.push_back(i);
			c = 1; 
			dfs(i);
			if (c > 2) {
				int m = tt[ans[0]]; int index = 0;
				for (int j = 1; j < ans.size();j++) {
					if (tt[ans[j]] > m) {
						m = tt[ans[j]]; index = j;
					}
				}
				int all = 0;
				for (int i = 0; i < ans.size() - 1; i++) {
					for (int j = i + 1; j < ans.size(); j++) {
						all += relation[ans[i]][ans[j]];
					}
				}
				if(all>K)
					result[iTos[ans[index]]] = c;
			}
		}
	}
	cout << result.size() << endl;
	for (auto it : result) {
		cout << it.first << " " << it.second << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值