震惊!衡阳市八中一信息老师竟卖肾干这种事情
Problem: 八中彩虹桥
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 29 Solved: 13
[Submit][Status][Web Board]
Description
八中有N个建筑物,从前八中很穷,只有N-1条边连通这N个点。
不过,现在ZY卖肾赚了巨多钱。
于是老大决定将八中所有建设物全架彩虹桥连起来,形成一个完全图。
不过出于对历史的尊敬,老大还是希望这个图的最小生成树仍是从前那N-1条边所组成的。
不过,现在ZY卖肾赚了巨多钱。
于是老大决定将八中所有建设物全架彩虹桥连起来,形成一个完全图。
不过出于对历史的尊敬,老大还是希望这个图的最小生成树仍是从前那N-1条边所组成的。
Input
本题为多组数据
第一行t,表示有t组测试数据
对于每组数据
第一行N,表示建筑物的个数N
2到N行,每行三个整数X,Y,Z;表示X和Y有一条长度为Z的路
第一行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
#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);
}
}