您的位置:首页 > 其它

1034. Head of a Gang

2013-03-14 17:13 323 查看


study disjoint-set data stucture:the key of solving this problem is the strategy to set and compute every equivalence class‘s member numbers.

// 1034. Head of a Gang.cpp: 主项目文件。

#include "stdafx.h"
#include <iostream>
#include <cstring>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;

const int N=1003;
typedef struct Edge{
int u,v,re;
Edge(int _u,int _v,int _re):u(_u),v(_v),re(_re){}
}Edge;
vector<Edge> edge;

int fa[2*N],own[2*N],memCnt[2*N],relation[2*N];
int cnt,thre;

map<string,int> cmap1;
map<int,string> cmap2;

priority_queue<string,vector<string>,greater<string> > Q;

bool cmp(Edge m1,Edge m2){
return m1.re<m2.re;
}

void init(int cnt){
for(int i=0;i<cnt;i++){
fa[i]=-1;
memCnt[i]=1;
relation[i]=0;
}
}

int findSet(int x){
if(fa[x]==-1)
return x;
int ret=findSet(fa[x]);
fa[x]=ret;
return ret;
}

void unionSet(int x,int y,int rr){
int root1=findSet(x);
int root2=findSet(y);
if(root1!=root2){
if(own[root1]<own[root2]){
fa[root1]=root2;
memCnt[root2]+=memCnt[root1];
}
else{
fa[root2]=root1;
memCnt[root1]+=memCnt[root2];
}
}
}

void operate(){
typedef vector<Edge>::iterator Itv;
for(Itv ite=edge.begin();ite!=edge.end();++ite)
unionSet(ite->u,ite->v,ite->re);
for(int i=0;i<cnt;i++){
if(fa[i]==-1)
relation[i]+=own[i];
else{
int root=findSet(i);
relation[root]+=own[i];
}
}
for(int i=0;i<cnt;i++){
if(fa[i]==-1&&memCnt[i]>2&&relation[i]/2>thre)
Q.push(cmap2[i]);
}
cout<<Q.size()<<endl;
while(!Q.empty()){
string tStr=Q.top();
cout<<tStr<<" "<<memCnt[cmap1[tStr]]<<endl;
Q.pop();
}
}

int main()
{
int m;
cin>>m>>thre;
memset(own,0,sizeof(own));
cnt=0;
for(int i=0;i<m;i++){
string id1,id2;
int tt;
cin>>id1>>id2>>tt;
if(cmap1.find(id1)==cmap1.end())
cmap1[id1]=cnt++;
if(cmap1.find(id2)==cmap1.end())
cmap1[id2]=cnt++;
int index1=cmap1[id1],index2=cmap1[id2];
Edge edgeTemp(index1,index2,tt);
edge.push_back(edgeTemp);
own[index1]+=tt;own[index2]+=tt;
}
sort(edge.begin(),edge.end(),cmp);
//create index
for(map<string,int>::iterator ite=cmap1.begin();ite!=cmap1.end();ite++)
cmap2[ite->second]=ite->first;
init(cnt);
operate();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: