最小生成树之Prim算法+堆优化

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define IOS ios::sync_with_stdio(false)
#define endl '\n'

using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
typedef pair<int, int> p;

vector<p>vec[maxn];
int vis[maxn];
int main() {
   
	int n, m;
	int u, v, val;
	int ans = 0;
	scanf("%d%d", &n, &m);
	memset(vis, 0, sizeof(vis));
	for (int i = 1;i <= m;++i) {
   
		scanf("%d%d%d", &u, &v, &val);//读入边
		vec[u].push_back(p(val, v));//顶点u到v距离为val
		vec[v].push_back(p(val, u));//顶点v到u距离为val
	}
	priority_queue<p, vector<p>, greater<p> >pq;//优先队列
	vis[1] = 1;
	for (int i = 0;i < vec[1].size();++i) {
   
		pq.push(vec[1][i]);//将与1相连的顶点入队
	}
	while (!pq.empty()) {
   
		p now = pq.top();
		pq.pop();
		if (!vis[now.second]) {
   //当前顶点没有被访问过
			vis[now.second] = 1;//标记已经被访问过
			ans += now.first;
		}
		for (int i = 0;i < vec[now.second].size();++i) {
   //枚举与刚刚进树的这个顶点
			if (!vis[vec[now.second][i].second]) {
   //相邻的顶点
				pq.push(vec[now.second][i]);//将其进队列 优先队列会自动排序
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}
全部评论

相关推荐

看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
程序员牛肉:公平那是对小孩子讲的童话故事,成年人的世界只有能不能接受失败的后果。 你要是能接受面试作弊被发现之后多家公司联合永久拉黑的后果,你就搞。
点赞 评论 收藏
分享
06-20 19:40
中原工学院 Java
网络存储:十几天不会让你拉人办卡就结束了吧?
点赞 评论 收藏
分享
05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 18:13
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务