/*
prim算法:找到当前最小的点加入生成树 然后用这个点更新其他没有加入生成树的点到生成树的距离
时间复杂度 n^2
*/#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>
using namespace std;constint N =1e3;int e[N][N];int n;
bool st[N];//标记这个点是否加入了生成树int dis[N];//标记这个到生成树的距离intprim(){//代价int ans =0;//初始化memset(dis,0x3f,sizeof dis);
dis[1]=0;for(int i=1;i<=n;i++){int t =0;for(int j=1;j<=n;j++)if(!st[j]&&(!t||dis[j]<dis[t]))t = j;
st[t]=1;
ans += dis[t];for(int j=1;j<=n;j++)if(!st[j])
dis[j]=min(dis[j],e[t][j]);}return ans;}intmain(){
cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
cin>>e[i][j];
cout<<prim()<<endl;return0;}
2.kruskal算法
/*
kruskal算法:贪心思想 对所有的边进行排序 然后从小的边开是看 如果两个点不在一个联通块内则将他们联通
时间复杂度 mlogm
*/#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#define x first#define y second
using namespace std;constint N =1000;typedef pair<int,int> PII;typedef pair<int,PII> PIII;int f[N];int n,m;
PIII edge[N];intfind(int x){return f[x]==x?x:f[x]=find(f[x]);}intmain(){
cin>>n>>m;for(int i=1;i<=n;i++)
f[i]= i;for(int i=1;i<=m;i++)
cin>>edge[i].y.x>>edge[i].y.y>>edge[i].x;sort(edge+1,edge+1+m);int ans =0;for(int i=1;i<=m;i++){int a = edge[i].y.x;int b = edge[i].y.y;
a =find(a);
b =find(b);if(a!=b){
f[a]= b;
ans += edge[i].x;}}
cout<<ans<<endl;return0;}