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

本题描述了一个关于构建完全图的问题,需要通过增加彩虹桥来连接N个建筑物,并确保最小生成树保持不变。输入包括多组数据,每组数据包含建筑物数量及已有边的信息。输出为所有新增彩虹桥总长度的最小值。

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\n",ans);
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值