题目链接:点击打开链接
Prim算法:
#include<cstdio>
int n;
int a[101][101];
#define INF 999999
int Prim()
{
int dist[101];
int v[101]={0};
int value=0;
for(int i=0;i<n;i++){
dist[i] = a[0][i];
}
for(int i=0;i<n;i++){
int minn = INF;
int k;
for(int j=0;j<n;j++){
if(!v[j] && dist[j] < minn){
minn = dist[j];
k = j;
}
}
//printf("%d->",minn);
value += minn;
v[k] = 1;
for(int j=0;j<n;j++){
if(!v[j] && dist[j] > a[k][j]){
dist[j] = a[k][j];
}
}
}
return value;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
int value = Prim();
printf("%d\n",value);
return 0;
}
#include<cstdio>
#include<algorithm>
using namespace std;
struct Node
{
int x,y,v;
}a[10001];
int n,k=0;
int pre[10001];
void Init()
{
for(int i=0;i<k;i++)
pre[i] = i;
}
int Find(int x)
{
return x == pre[x]? x:Find(pre[x]);
}
bool cmp(Node p,Node q)
{
return p.v<q.v;
}
int main()
{
int v;
int maxx = 0;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&v);
a[k].x = i;
a[k].y = j;
a[k++].v = v;
}
}
sort(a,a+k,cmp);
Init();
for(int i=0;i<k;i++){
if(Find(a[i].x) != Find(a[i].y)){
pre[Find(a[i].x)] = Find(a[i].y);
maxx += a[i].v;
}
}
printf("%d\n",maxx);
return 0;
}