[luogu1265]公路修建
阿新 • • 發佈:2018-09-09
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]公路修建