给一手链接 https://www.luogu.com.cn/problem/P1265
这道题本质上就是最小生成树,题目描述就是prim的思想
TIP:注意稠密图和稀疏图的区别
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> using namespace std; const int M=1e5+7; const double inf=10000007; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,x[M],y[M],vis[M]; double ans,d[M]; double G_d(int a,int b){return sqrt(1.0*(x[a]-x[b])*(x[a]-x[b])+1.0*(y[a]-y[b])*(y[a]-y[b]));} void prm(){ vis[1]=1; d[1]=0.0; for(int i=2;i<=n;i++) d[i]=G_d(1,i); // for(int i=1;i<=n;i++) printf("%.2lf ",d[i]); puts(""); for(int i=2;i<=n;i++){ int id,mn=inf; for(int j=2;j<=n;j++)if(!vis[j]&&d[j]<mn) mn=d[j],id=j; vis[id]=1; for(int j=2;j<=n;j++)if(!vis[j]) d[j]=min(d[j],G_d(id,j)); } } int main(){ n=read(); for(int i=1;i<=n;i++) x[i]=read(),y[i]=read(); prm(); for(int i=1;i<=n;i++) ans+=d[i]; printf("%.2lf\n",ans); return 0; }