#include<iostream>
#include<map>
#include<string>
using namespace std;
const int maxn = 2010;
map<int, string> numtostr;
map<string, int> strtonum;
map<string, int> gang;
int G[maxn][maxn] = { 0 }, weight[maxn] = { 0 };
int n, k, num=0;
bool vis[maxn] = { false };
int change(string a)
{
if (strtonum.find(a) != strtonum.end()) return strtonum[a];
else
{
strtonum[a] = num;
numtostr[num] = a;
return num++;
}
}
void dfs(int nowvisit, int& head, int& nummember, int& total)
{
nummember++;
vis[nowvisit] = true;
if (weight[nowvisit] > weight[head]) head = nowvisit;
for (int i = 0; i < num; i++)
{
if (G[nowvisit][i] != 0)
{
total += G[nowvisit][i];
G[nowvisit][i] = G[i][nowvisit] = 0;
if (vis[i] == false)
{
dfs(i, head, nummember, total);
}
}
}
}
void dfstrave()
{
for (int i = 0; i < num; i++)
{
if (vis[i] == false)
{
int head = i, nummember = 0, total = 0;
dfs(i, head, nummember, total);
if (nummember > 2 && total > k) gang[numtostr[head]]=nummember;
}
}
}
int main()
{
int time;
string a, b;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> a >> b>>time;
int id1 = change(a);
int id2 = change(b);
weight[id1] += time;
weight[id2] += time;
G[id1][id2] += time;
G[id2][id1] += time;
}
dfstrave();
cout << gang.size() << endl;
for (map<string,int>::iterator it=gang.begin();it!=gang.end();it++)
{
cout << it->first << " " << it->second << endl;
}
return 0;
}
A1034 Head of a Gang (30 分)
最新推荐文章于 2022-06-25 08:24:30 发布