[luogu1265]公路修建

传送门

你会发现第二条规则不存在,因为在形成环之前,这几个城市就已经连通了。所以直接求最小生成树即可。

然后你会发现,边数特别多,所以Kruskal会TLE,并且开邻接表存图会MLE

所以干脆直接Prim了,因为是完全图,所以每个点对其他点都有边,那么直接遍历即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define MAXN 5005

struct Node{
    int x,y;
}E[MAXN];

double dis[MAXN];
bool vis[MAXN];

inline double diss(Node a,Node b){
    return sqrt((double)(a.x-b.x)*(a.x-b.x)+(double)(a.y-b.y)*(a.y-b.y));
}

int N;
int main(){

    std::memset(vis,false,sizeof(false));

    scanf("%d",&N);
    for(register int i=1;i<=N;++i){
        scanf("%d%d",&E[i].x,&E[i].y);
        dis[i] = 2147483647;
    }
    dis[1] = 0;

    double ans = 0;

    for(register int i=1;i<=N;++i){

        int u;
        double minn = 2147483647;

        for(register int j=1;j<=N;++j){
            if(!vis[j]&&dis[j]<minn){
                minn = dis[j];
                u = j;
            }
        }

        vis[u] = true;
        ans += dis[u];

        for(register int j=1;j<=N;++j){
            if(!vis[j]&&dis[j]>diss(E[u],E[j])){
                dis[j] = diss(E[u],E[j]);
            }
        }
       
    }
    
    printf("%.2lf",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Neworld2002/p/9610987.html
今日推荐