并查集.差不多嘛

路径规划

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65535/102400K (Java/Other)
Total Submission(s) : 120   Accepted Submission(s) : 47
Font: Times New Roman | Verdana | Georgia
Font Size: ← →

Problem Description

一丁没事的时候喜欢研究地图,有一天看着地图,他产生了一个疑惑。
地图上有n个城市,现在一丁想给这n个城市之间造路,希望能让城市之间两两可达。一丁给出了m种供选择的道路,每种选择是一个三元组(u, v, w),代表给u城市和v城市之间建造一条长度为w的道路。
一丁当然希望最终的道路总长越小越好,但同时他又很矛盾的希望所有选择的道路中最长的那条路越长越好,你能帮帮他吗?

Input

第一行给出一个整数T(1<=T<=20),表示测试数据的数目。
每一组测试数据第一行包含两个正整数n和m。
(2<=n<=100,1<=m<=10000)

接下来是m行数据,每行数据都是三个空格隔开的正整数u, v, w 
(1<=u,v<=n,1<=w<=10000)

题目保证至少存在一种方案,使得城市两两可达。

Output

对于每组数据,输出一行用空格隔开的两个数:路径总长和所有路中最长的那条路的长度。
每组数据输出一行。

Sample Input

1
3 3
1 2 1
1 3 2
2 3 1

Sample Output

2 1

Source

"字节跳动杯"杭州电子科技大学第十八届程序设计竞赛





#include<bits/stdc++.h>

using namespace std;
struct node 
{ 
  int begin;
  int end;
  int lengg;
}bin[10000];
int fx,fy,n,fa[1000],m,ans,q,maxx=-100;
bool cmp(node a,node b) 
{ 
   return a.lengg<b.lengg; 
}
int Find(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=Find(fa[x]);
}
int Merge(int x,int y)
{
    fx=Find(x);
fy=Find(y);
    if(fx!=fy) 
fa[fy]=fx;
}
int kru()
{
    sort(bin,bin+m,cmp);
    for(int i=0;i<=n;i++) fa[i]=i;
    ans=0;
    for(int i=0;i<m;i++)
    { if(Find(bin[i].begin)!=Find(bin[i].end)) 
    {
Merge(bin[i].begin,bin[i].end);
ans+=bin[i].lengg;
if(bin[i].lengg>maxx)
maxx=bin[i].lengg;
}
    }
    return ans;
}
int main()
{
int T;
scanf("%d",&T);
    for(int i=0;i<T;i++)
    {
    maxx=-100;
    scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++) 
scanf("%d%d%d",&bin[i].begin,&bin[i].end,&bin[i].lengg);
        printf("%d",kru());
        printf(" %d\n",maxx);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值