1. 程式人生 > >[luogu1265]公路修建

[luogu1265]公路修建

n) 完全 tdi reg gis tps new 規則 algo

傳送門

你會發現第二條規則不存在,因為在形成環之前,這幾個城市就已經連通了。所以直接求最小生成樹即可。

然後你會發現,邊數特別多,所以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;
}

[luogu1265]公路修建