【Luogu P1265]道路工事

Luogu P1265は
始まるクラスカル私が使用していた......が、二重の8バイトのために、そうMLE。
最小全域木問題を見つけることは非常に簡単です。
第2の制限の対象に、即ち、唯一の一意のリングがある場合は、正多角形であることに留意されたいです。
それは正多角形である場合でも、......何の違いが、この制限は与えませんでしたし、絶対に与える
ことが木問題をまたがる最低限ですので。
統計の右側を記録するクラスカル必要があるため、しかし、問題は完全グラフ、スペースのオーバーヘッドの多くを与えています。
必要なときプリムは、何の初期のレコードを、一般的なオーバーヘッドスペースを計算することができません。
実際にはこれはプリムのアルゴリズムと異なるの原則にクラスカル法です。
プリム法はクラスカル法をセンター側に基づいており、アルゴリズムの中心点です。
まばらなグラフではクラスカルはプリムを上回ったが、それは緻密で、完全な数字プリムの観点から、より適切であろう。

#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
long long n,cost[5005],x[5005],y[5005];
bool vis[5005];
double ans;
void First()
{
    for (int i=0;i<=n;i++) cost[i]=inf;
    cost[1]=0;
}
void Prim()
{
    for (int i=1;i<=n;i++)
    {
        long long mincost=inf,m=0;
        for (int j=1;j<=n;j++)
            if (mincost>cost[j]&&!vis[j]) 
            {
                mincost=cost[j];
                m=j;
            }
        vis[m]=true;
        ans+=sqrt(cost[m]);
        for (int j=1;j<=n;j++)
            if ((x[m]-x[j])*(x[m]-x[j])+(y[m]-y[j])*(y[m]-y[j])<cost[j]&&!vis[j]) 
                cost[j]=(x[m]-x[j])*(x[m]-x[j])+(y[m]-y[j])*(y[m]-y[j]);
    }
}
int main()
{
    scanf("%lld",&n);
    for (int i=1;i<=n;i++)
        scanf("%lld%lld",&x[i],&y[i]);
    First();
    Prim();
    printf("%.2f",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/notscience/p/11957415.html