震惊!衡阳市八中一信息老师竟卖肾干这种事情

Problem I: 八中彩虹桥

Problem: 八中彩虹桥

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 29  Solved: 13
[Submit][Status][Web Board]

Description

八中有N个建筑物,从前八中很穷,只有N-1条边连通这N个点。
不过,现在ZY卖肾赚了巨多钱。
于是老大决定将八中所有建设物全架彩虹桥连起来,形成一个完全图。
不过出于对历史的尊敬,老大还是希望这个图的最小生成树仍是从前那N-1条边所组成的。

Input

本题为多组数据
 第一行t,表示有t组测试数据
 对于每组数据
 第一行N,表示建筑物的个数N
 2到N行,每行三个整数X,Y,Z;表示X和Y有一条长度为Z的路

Output

对于每组数据,输出一个整数,表示修建的所有彩虹桥总长度的最短值。

Sample Input

2
3
1 2 2
1 3 3
4
1 2 3
2 3 4
3 4 5 

Sample Output

4
17

HINT

[Submit][Status]
#include <cstdio>
#include <algorithm>
using namespace std;
int T,i,u,v;
struct Edge
{int x,y,val;} e[6001];
bool operator<(Edge x,Edge y)
{return x.val<y.val;}
int n,head[6001],ecnt,fa[6001],s[6001],ans;
int find(int x)
{return x==fa[x]?fa[x]:fa[x]=find(fa[x]);}
int main() {
    scanf("%d",&T);
    while(ans=0,T--) {
        scanf("%d",&n);
        for(i=1; i<n; i++) scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].val);
        sort(e+1,e+n);
        for(i=0; i<=n; i++) fa[i]=i,s[i]=1;
        for(i=1; i<n; i++)
            u=find(e[i].x),v=find(e[i].y),
            u!=v?
                fa[u]=v,
                ans+=(e[i].val+1)*(s[u]*s[v]-1),
                s[v]+=s[u]:0;
        printf("%d
",ans);
    }
}
原文地址:https://www.cnblogs.com/ZhaoChongyan/p/11740398.html