记录编号 537109 评测结果 AAAAAAAAAA
题目名称 [TYVJ 1399]走廊泼水节 最终得分 100
用户昵称 GravatarDeacep 是否通过 通过
代码语言 C++ 运行时间 0.593 s
提交时间 2019-07-09 11:59:54 内存使用 13.70 MiB
显示代码纯文本
    //思路:按边权排序(小到大)依次取出队首元素,则此时连接此边两端点集的长度为此边权+1;
	//而需要连接的边的数量为两点集数量之积-1,因为两集联通而无环,连接两集仅一条边,否则产生回路,与n-1条矛盾 
	#include<bits/stdc++.h>
    using namespace std;
    int n;
    int f[6005];
    int s[6005];
    /*struct node{
    	int to;
    	int cs;
    	node(int x,int y):to(x),cs(y){}
    }pcb[6005];*/
    void Init(){
    	for(int i=1;i<=n;i++){
    	s[i]=1;
    	f[i]=i;}
    }
    int fid(int x){
    	if(x!=f[x]){
    	return f[x]=fid(f[x]);}
    	return x;
    }
    void mg(int x,int y){
    	int fx=fid(x),fy=fid(y);
    	if(s[fx]>=s[fy]){
    		f[fy]=fx;
    		s[fx]+=s[fy];//这里不能只加1(当时脑抽把。。 
    	}
    	else{
    		f[fx]=fy;
    		s[fy]+=s[fx];
    	}
    }
    struct edg{
    	int u,v,c;
    	edg(int x,int y,int z):u(x),v(y),c(z){}
    	bool operator < (edg q)const{return c>q.c;}
    };
    priority_queue<edg> e;
    int main(){
    	freopen("corridor.in","r",stdin);
    	freopen("corridor.out","w",stdout);
    	short t;
    	cin>>t;
    	while(t--){
    		memset(f,0,sizeof(f));
    		cin>>n;
    		Init();
    		int p,q,r;
    		for(int i=0;i<n-1;i++){
    			cin>>p>>q>>r;
    	//		pcb[p].push_back(node(q,r));
    	//		pcb[q].push_back(node(p,r));
    			e.push(edg(p,q,r));
    		}
    	int ans=0;
    	while(!e.empty()){
    		edg tp=e.top();
    		e.pop();
    		if(fid(tp.u)!=fid(tp.v)){
    			ans=ans+(s[fid(tp.u)]*s[fid(tp.v)]-1)*(tp.c+1);
    			mg(tp.u,tp.v);
    		}
    	}
    	cout<<ans<<endl;
    }
    	return 0;
    }