一、题目大意
二、解题思路
先按照并查集
找到各个联通分量,并记录每个节点的总时间
t. 然后以每个联通分量的root
为基, 确定每个联通分量的总时间
、总人数
和老大
。
三、代码
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
const int MAX = 1005;
int id2time[MAX], father[MAX];
map<string, int> name2id;
map<int, string> id2name;
struct Node
{
int time, num, head_time;
string head;
bool operator <(const Node&A)const
{
return head < A.head;
}
}group[MAX];
int N, K, cnt;
void init()
{
cnt = 0;
name2id.clear();
id2name.clear();
memset(id2time, 0, sizeof(id2time));
memset(father, -1, sizeof(father));
for(int i=0; i<MAX; i++)
{
group[i].head_time = -1;
group[i].time = group[i].num = 0;
group[i].head = "ZZZZZZZZZZZZZZZ";
}
}
int find_father(int x)
{
if(father[x] == -1)
return x;
int fa = find_father(father[x]);
return father[x] = fa;
}
int main()
{
while(cin >> N >> K)
{
init();
string a, b;
int t;
for(int i=0; i<N; i++)
{
cin >> a >> b >> t;
if(!name2id.count(a))
{
id2name[cnt] = a;
name2id[a] = cnt++;
}
if(!name2id.count(b))
{
id2name[cnt] = b;
name2id[b] = cnt++;
}
id2time[name2id[a]] += t;
id2time[name2id[b]] += t;
int fa = find_father(name2id[a]);
int fb = find_father(name2id[b]);
if(fa != fb)
father[fa] = fb;
}
//cout << name2id["Q"] << endl;
//cout << find_father(5) << endl;
//cout << id2name[find_father(5)] << endl;
for(int i=0; i<cnt; i++)
{
int fa = find_father(i);
group[fa].num++;
group[fa].time+=id2time[i];
if(id2time[i] > group[fa].head_time)
{
group[fa].head_time = id2time[i];
group[fa].head = id2name[i];
}
}
int ans_size = 0;
for(int i=0; i<cnt; i++)
{
//cout << group[i].head << " " << group[i].num << " " << group[i].head_time << endl;
if(group[i].num <= 2)
continue;
if(group[i].time <= 2 * K)
continue;
ans_size++;
//cout << group[i].head << " " << group[i].num << " " << group[i].head_time << endl;
}
sort(group, group+cnt);
cout << ans_size << endl;
for(int i=0; i<cnt; i++)
{
if(group[i].num <= 2)
continue;
if(group[i].time <= 2 * K)
continue;
cout << group[i].head << " " << group[i].num << endl;
}
}
return 0;
}