题目链接
最小生成树一般是利用贪心的克鲁斯卡尔算法Prim不会写,克鲁斯卡尔是一个离线算法,首先将边读入,按边值排序,再从小往大加边,若两个端点在一起了,则不加,否则加,直至加了n-1条边,若不行,则无最小生成树。
时间:500ms。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int f[5001];
struct node
{
int x,y,z;
}al[200001];
bool cmp(node a,node b)
{
return a.z<b.z;
}
int find(int a)
{
if(f[a]==a)
{
return a;
}
return f[a]=find(f[a]);
}
int main()
{
int ans,n,m,i,j,k;
cin>>n>>m;
for(i=1;i<=5000;i++)
{
f[i]=i;
}
for(i=1;i<=m;i++)
{
cin>>al[i].x>>al[i].y>>al[i].z;
}
sort(al+1,al+1+m,cmp);
k=n;
for(i=1;i<=m;i++)
{
if(find(al[i].x)==find(al[i].y))
{
continue;
}
f[find(al[i].x)]=find(al[i].y);
k--;
ans+=al[i].z;
if(k==1)
{
break;
}
}
cout<<ans;
return 0;
}