图论---朴素Prim(稠密图)

O( n ^2 )

  • 题目通常会提示数据范围

    • V ≤ 500,两种方法均可(朴素Prim更稳)。

    • V ≤ 1e5,必须用优先队列Prim + vector 存图。

cpp 复制代码
// 最小生成树 ---朴素Prim
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
 
const int N=510,INF=0x3f3f3f3f;
int n,m;
int g[N][N];
int dist[N]; //表示这个点到集合的距离
bool st[N];
 
int prim()
{
	memset(dist,0x3f,sizeof dist);
	int res=0;
	for(int i=0;i<n;i++)
	{
		int t=-1;
		//找到集合外距离集合最近的点
		for(int j=1;j<=n;j++)
            //找到不在集合当中,且距离集合最近的一个点
			if(!st[j] && (t==-1||dist[t]>dist[j]))
				t=j;
        //举例集合最近的点的距离是INF,说明图不连通
		if(i && dist[t]==INF) return INF;
		//只要不是第一个点,就把新加进来的这条边加到答案里
		if(i) res+=dist[t];
		//用 t 来更新其它的点
		for(int j=1;j<=n;j++) dist[j]=min(dist[j],g[t][j]);
		st[t]=true;
	}
	return res;
}
 
int main()
{
	cin>>n>>m;
	memset(g,0x3f,sizeof g);
	while(m--)
	{
		int a,b,c;
		cin>>a>>b>>c;
		g[a][b]=g[b][a]=min(g[a][b],c);
	}
	int t=prim();
	if(t==INF) puts("impossible");
	else cout<<t<<endl;
	return 0;
}
相关推荐
superman超哥9 分钟前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉
Learner__Q39 分钟前
每天五分钟:滑动窗口-LeetCode高频题解析_day3
python·算法·leetcode
J ..1 小时前
C++ 多线程编程基础与 std::thread 使用
c++
你的冰西瓜1 小时前
C++标准模板库(STL)全面解析
开发语言·c++·stl
阿昭L1 小时前
leetcode链表相交
算法·leetcode·链表
闻缺陷则喜何志丹1 小时前
【计算几何】仿射变换与齐次矩阵
c++·数学·算法·矩阵·计算几何
chen_ever1 小时前
Protobuf详解(从安装到实战)
c++·rpc·信息与通信
liuyao_xianhui1 小时前
0~n-1中缺失的数字_优选算法(二分查找)
算法
hmbbcsm2 小时前
python做题小记(八)
开发语言·c++·算法
机器学习之心2 小时前
基于Stacking集成学习算法的数据回归预测(4种基学习器PLS、SVM、BP、RF,元学习器LSBoost)MATLAB代码
算法·回归·集成学习·stacking集成学习