题目大意 假如A和B有通话,就称他们是有关系的。并且A和B之间的权值就是他们通话的时间。一个匪帮被假定为有两个人以上,以及他们之间的权值之和(也就是通话时间之和)超过一个给定的阈值K。在每个匪帮中首领被定义为权值最大的人。现在你需要找出匪帮以及其首领。
显然这是道图的问题。匪帮的个数也就是图的连通分量,可以先用DFS求出图的连通分量,判断各个连通分量的顶点个数是否超过2以及权值之和是否超过阈值K
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
struct node {
int c; //表示结点的字符值
int w; //表示权重
};
struct out1 { // 用于输出,
char c1; //记录输出的那个字符
int num; //记录输出的每个组的成员个数
friend bool operator < (out1 o1, out1 o2) {
return o1.c1 > o2.c1; //ASCII码大的排在后面。即按照字母序排序。
}
};
priority_queue<out1>pq1;
int main() {
int N = 0; //N组数据
int K = 0; //门限值为K
cin >> N >> K;
if (N < 0 || N>1000) { return -1; }
if (K < 0 || K>1000) { return -1; }
int Gra[26] = {0}; //记录每个点的权重
bool flag2[26] = { false };
int flag1[26][26] = { 0 };//表示这两个点之间有边,无向图。
//输入数据,更新相应的数组信息。
for (int i = 0; i < N; i++) {
string s1, s2;
cin >> s1; cin >> s2;
int w1;
cin >> w1;
Gra[((int)s1[0]) - 65] = Gra[((int)s1[0]) - 65] + w1; //记录每个点的权重
Gra[((int)s2[0]) - 65] = Gra[((int)s2[0]) - 65] + w1;
flag1[((int)s1[0]) - 65][((int)s2[0]) - 65] = flag1[((int)s1[0]) - 65][((int)s2[0]) - 65] + w1; //表示这两个点之间的边,无向图。
flag1[((int)s2[0]) - 65][((int)s1[0]) - 65] = flag1[((int)s1[0]) - 65][((int)s2[0]) - 65];
}
//接下来是DFS
stack<node>s3;
for (int i4 = 0; i4 < 26; i4++) {
node t;
int total = 0;//记录总的权值。
int max2 = 0; //记录点权最大的值
int max1 = 0;//记录最大点权的下标。
for (int i = 0; i < 26; i++) {
if (Gra[i] > 0 && !flag2[i]) {
t.c = i;
t.w = Gra[i];
s3.push(t);
flag2[i] = true;
max2 = Gra[i];
max1 = i;
break;
}
} //找到第一个字符,开始。
if (s3.empty()) { break; } //如果每个元素都已经处理了一遍了。直接返回。
int k3 = 1; //表示个数
while (!s3.empty()) {
node t1 = s3.top();
int i1 = 0;
for (; i1 < 26; i1++) {
if (flag1[t1.c][i1]) { node t2; t2.c = i1; t2.w = Gra[i1]; total = total + flag1[t1.c][i1]; s3.push(t2);
if (Gra[i1] > max2) { max2 = Gra[i1]; max1 = i1; }
if (!flag2[i1]) { k3++; flag2[i1] = true; }
flag1[t1.c][i1] = flag1[i1][t1.c] = 0; break;}
}
if (i1 == 26) { s3.pop(); }
}
if (k3> 2 && total>K ) { out1 out; out.num = k3; out.c1 = (char)(max1 + 65); pq1.push(out); }
}
int k2 = pq1.size();
if (k2 > 0) {
cout << k2<<endl;
while (!pq1.empty()) {
cout << pq1.top().c1 << pq1.top().c1 << pq1.top().c1 << " " << pq1.top().num <<endl;
pq1.pop();
}
}
else { cout << 0; }
return 0;
}
只通过两个测试点,郁闷。