最小生成树 自己太死板了!老是RE 最后才发现数组开小了!将已连接的点的权值赋值为零就好了
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define N 150000 #define M 755 using std::sort; struct dat { int nx; int ny; double nl; bool operator <(const dat p)const { return nl<p.nl; } } a[600000]; double point[M][2]; bool vis[M][M]; int n,m,t; int p[N]; void solve() { m=0; for(int i=1; i<=n; i++) { for(int j=i+1; j<=n; j++) { if(vis[i][j]) a[m].nl=0.0; else { double x=point[i][0]-point[j][0]; double y=point[i][1]-point[j][1]; a[m].nl=(double)sqrt(x*x+y*y); } a[m].nx=i; a[m++].ny=j; } } sort(a,a+m); for(int i=1; i<=n; i++) p[i]=i; } int find(int x) { return p[x]==x?x:p[x]=find(p[x]); } int main() { while(scanf("%d",&n)==1) { for(int i=1; i<=n; i++) scanf("%lf %lf",&point[i][0],&point[i][1]); scanf("%d",&t); int d,c; memset(vis, false, sizeof(vis)); for(int i=0; i<t; i++) { scanf("%d %d",&d,&c); vis[d][c]=vis[c][d]=true; } solve(); double sum=0; for(int i=0; i<m; i++) { int x=find(a[i].nx); int y=find(a[i].ny); if(x!=y) { sum+=a[i].nl; p[x]=y; } } printf("%.2lf\n",sum); } return 0; }
浙公网安备 33010602011771号