51nod 1212——无向图最小生成树(最小生成树)

N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。

Input

第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000) 
第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)

Output

输出最小生成树的所有边的权值之和。

Sample Input

9 14
1 2 4
2 3 8
3 4 7
4 5 9
5 6 10
6 7 2
7 8 1
8 9 7
2 8 11
3 9 2
7 9 6
3 6 4
4 6 14
1 8 8

Sample Output

37

题意: 太简单不说啦!

题解:最小生成树模板题,详细请看代码。

#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 50000+5;
int tree[MAX];
struct hh{ 
    int s;
	int e;
	int w;	
}a[MAX];
bool cmp(hh a, hh b){
	return a.w<b.w;
}
int find(int x){//看看是否已经连在一起
	return tree[x]==0? x:tree[x]=find(tree[x]);
}
int lianjie(int x,int y){//连接边
	int root1=find(x);
	int root2=find(y);
	if(root1!=root2){
		tree[root1]=root2;
		return 1;
	}
	return 0;
}
int main(){
	int n,m;
	cin >> n >> m;
	for (int i = 1; i <= n;i++) tree[i]=0;
	for (int i = 1; i <= m;i++){
		cin >> a[i].s >> a[i].e >> a[i].w;
	}
	sort(a+1,a+m+1,cmp);//按权值从小到大排序
	int sum=0;
	for(int i = 1; i <= m;i++){
		if(lianjie(a[i].s,a[i].e)) sum+=a[i].w;//如果没有连在一起加上该边权值
	}
	cout << sum << endl;
	return 0;	
} 

 

全部评论

相关推荐

2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司
点赞 评论 收藏
分享
01-23 14:54
同济大学 Java
热爱敲代码的程序媛:给你提几点【专业技能】这个模块里面可优化的地方:1.【具备JVM调优经验】可以去b站上搜一下JVM调优的视频,估计一两个小时凭你的学习能力就能掌握JVM调优的实践方面的技能。2.【MySql优化】MySql这一栏,你去b站或者找个博客看看MySql优化,学一下,如果你本身比较熟悉MySql语句的话,那基本半天时间凭你的学习能力MySql语句优化方面的技能你也能掌握个差不多。以上1,2两点主要是因为我看你专业技能大部分都说的是偏理论,没有写应用。再就是最后,你结合你的项目,想一想你的项目中哪些sql语句是可以用MySql优化的,到时候你面试的时候也好结合着说一下。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务