您的位置:首页 > 其它

pat 1034. Head of a Gang (30)

2016-11-29 15:19 417 查看
题意:求边权大于k并且点数大于2的联通块,输出其中的重要点,重要点:联通块中与该点相连的边权最大

丢set里乱搞

#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;

set<int> s[maxn];
int f[maxn],n,k,g[maxn];
int gg[maxn];
void init(){
for(int i=1;i<=2*n;i++)s[i].insert(i),f[i]=i;
}

void uoin(int i,int j,int w){
i=f[i];j=f[j];
if(i==j){g[i]+=w;return ;}
if(i>j)swap(i,j);
for(auto x: s[j]){
f[x]=i;
s[i].insert(x);
}
g[i]+=g[j]+w;
s[j].clear();
}
//编号
map<string,int> no;
map<int,string> on;
int tot=1;
int newnode(string s){
if(no[s]==0)
no[s]=tot,on[tot]=s,tot++;
return no[s];
}

int main(){
cin>>n>>k;
init();
string s1,s2;int w;
for(int i=1;i<=n;i++){
cin>>s1>>s2>>w;
int a=newnode(s1),b=newnode(s2);
gg[a]+=w;gg[b]+=w;
uoin(a,b,w);
}

vector<pair<string,int> > q;
for(int i=1;i<tot;i++){
if(s[i].size()<=2||g[i]<=k)continue;
int ans=-1,_max=0;
for(auto x: s[i]){
if(gg[x]>_max)_max=gg[x],ans=x;
}
q.push_back(make_pair(on[ans],s[i].size()));
}
cout<<q.size()<<endl;
sort(q.begin(),q.end());
for(auto pr:q) {
cout<<pr.first<<" "<<pr.second<<endl;
}
return 0;
}


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