1034. Head of a Gang

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;
}


發佈了145 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章