题目链接:最小生成树一·Prim算法
题目大意:给你一张无向带权完全图,求最小生成树
题目思路:因为题目要求的是朴素的prim做法来解决这样一道题,所以我们采用朴素的prim做法,具体算法讲解参见我的B站算法讲堂:算法讲堂
时间复杂度&&空间复杂度:O(n*n)&&O(n*n)(n为点的个数)
#include <map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e3+10;
int n,mat[maxn][maxn],d[maxn],vis[maxn];
int ans,End;
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
scanf("%d",&mat[i][j]);
}
}
memset(d,0x3f3f3f,sizeof(d));
memset(vis,0,sizeof(vis));
d[1] = 0;
ans = 0;
for(int i = 1;i <= n;i++){
End = -1;
for(int j = 1;j <= n;j++){
if(!vis[j]&&(End == -1||d[End] > d[j]))
End = j;
}
ans += d[End];
vis[End] = 1;
for(int j = 1;j <= n;j++){
if(!vis[j]&&d[j] > mat[End][j])
d[j] = mat[End][j];
}
}
printf("%d\n",ans);
}