您的位置:首页 > 其它

1034. Head of a Gang (30)

2015-01-06 20:52 295 查看
#include <iostream>
#include <cstdio>
#include <set>
#include <map>
using namespace std;

#define N (26*26*26)

inline int root(int n, int rid[]) {
while(rid
!= n)
n = rid
;
return n;
}

inline int id(char str[]) {
return (str[0]-'A')*26*26 + (str[1]-'A')*26 + (str[2]-'A');
}

int main(int argc, char **argv) {

int rid
;
int count
= {};
int pct
= {};
int gct
= {};
for(int i = 0; i < N; i ++) rid[i] = i;

int n, k;
cin >> n >> k;
for(int i = 0; i < n; i ++) {
char aid[4], bid[4];
int m;
scanf("%s%s%d", aid, bid, &m);
int a = id(aid);
int b = id(bid);
int call1 = (a << 16) | b;
int call2 = (b << 16) | a;

int ra = root(a, rid);
int rb = root(b, rid);

if(ra == a && !pct[a]) {
count[ra] ++;
}
if(rb == b && !pct[b]) {
count[rb] ++;
}

pct[a] += m;
pct[b] += m;

int rr = ra;
if(ra != rb) {
if(count[ra] > count[rb]) {
count[ra] += count[rb];
gct[ra] += gct[rb];
rid[rb] = ra;
rr = ra;
}
else {
count[rb] += count[ra];
gct[rb] += gct[ra];
rid[ra] = rb;
rr = rb;
}
}
gct[rr] += m;
}

map<int, int> gang;
for(int i = 0; i < N; i ++) {
int r = root(i, rid);
if(count[r] > 2 && gct[r] > k) {
map<int, int>::iterator it = gang.find(r);
if(it != gang.end()) {
int old = it->second;
if(pct[old] < pct[i])
it->second = i;
}
else
gang[r] = i;
}
}

set<int> head;
for(map<int, int>::iterator it = gang.begin(); it != gang.end(); it ++)
head.insert(it->second);

cout << head.size() << endl;
for(set<int>::iterator it = head.begin(); it != head.end(); it ++) {
int id = *it;
putchar(id/26/26 + 'A');
putchar(id/26%26 + 'A');
putchar(id%26 + 'A');
putchar(' ');
printf("%d\n", count[root(id, rid)]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: