
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX_N 2000
typedef long long ll;
int N,L[MAX_N];
void solve()
{
ll ans=0;
while(N>1)
{
int mii1=0,mii2=1;
if(L[mii1]>L[mii2])
swap(mii1,mii2);
for(int i=2;i<N;i++)
{
if(L[i]<L[mii1])
{
mii2=mii1;
mii1=i;
}
else if(L[i]<L[mii2])
{
mii2=i;
}
}
int t=L[mii1]+L[mii2];
ans+=t;
if(mii1==N-1)
swap(mii1,mii2);
L[mii1]=t;
L[mii2]=L[N-1];
N--;
}
printf("%lld\n",ans);
}
int main()
{
printf("N:\n");
scanf("%d",&N);
for(int i=0;i<N;i++)
{
printf("L[%d]:\n",i);
scanf("%d",&L[i]);
}
solve();
return 0;
}
版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.youkuaiyun.com/nomasp
本文介绍了一个使用C++实现的最小生成树算法,通过不断合并边权重最小的两个节点,直至形成一棵树。算法首先寻找当前集合中权值最小的两个节点,然后将这两个节点合并,并更新节点集合,直至所有节点都属于同一集合。
447

被折叠的 条评论
为什么被折叠?



