1034. Head of a Gang
2013-03-14 17:13
232 查看
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; }
相关文章推荐
- PAT-A 1034. Head of a Gang (dfs)
- 1034. Head of a Gang
- 1034. Head of a Gang
- 1034. Head of a Gang
- 1034. Head of a Gang
- PAT 1034. Head of a Gang
- 1034. Head of a Gang
- (pat)A1034. Head of a Gang
- 1034. Head of a Gang
- 重庆“打黑” gang crackdown
- [论文笔记] Live Gang Migration of Virtual Machines (HPDC, 2011)
- 九度OJ 1446 Head of a Gang -- 并查集
- PAT (Advanced) 1034. Head of a Gang (30)
- A1034. Head of a Gang (30)
- pat1034Head of a Gang (30)
- PAT (Advanced Level) Practise 1034 Head of a Gang (30)
- 1034. Head of a Gang (30)
- 【bzoj1370】[Baltic2003]Gang团伙 并查集
- Gang Black and Gang White (二分图染色法)
- PAT [A1034]-Head of a Gang