题目
求最小生成树
分析
因为它是对称的,所以只需一半的内存,然后剩下的和Kruskal差不多了。
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
struct node{int x,y,w;}e[12500001];
int f[5001],n,nod,ans,m;
inline int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void add(int i,int j,int k){e[++m].x=i; e[m].y=j; e[m].w=k;}
bool cmp(node u,node v){return u.w<v.w;}
int find(int u){return (f[u]==u)?u:f[u]=find(f[u]);}
int main(){
n=in();
for (int i=1;i<=n;i++) f[i]=i;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i<j) add(i,j,in()); else in();
stable_sort(e+1,e+1+m,cmp);//快排
while (--n){
int k1=find(e[++nod].x);
int k2=find(e[nod].y);
if (k1!=k2) f[k1]=k2,ans+=e[nod].w; else n++;//不在同一集合吗
}
printf("%d",ans);
return 0;
}