路径规划
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的道路。
一丁当然希望最终的道路总长越小越好,但同时他又很矛盾的希望所有选择的道路中最长的那条路越长越好,你能帮帮他吗?
地图上有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)
题目保证至少存在一种方案,使得城市两两可达。
每一组测试数据第一行包含两个正整数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);
}
}