题意:同poj1751 思路:同上。 #include<iostream> #include<cstdio> #include<cstring> #include<math.h> using namespace std; class tt { public: double x,y; }dis[1001]; double g[1001][1001]; int n,m; void solve_dis() { int i,j; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) { g[j][i]=g[i][j]=sqrt((dis[i].x-dis[j].x)*(dis[i].x-dis[j].x)+(dis[i].y-dis[j].y)*(dis[i].y-dis[j].y)); } } void prim() { int k,i,j; double res=0,dist[1001],dis,min; double maxcost =999999999; bool vis[1001]; for(i=1;i<=n;i++) { dist[i]=maxcost; vis[i]=true; } dist[1]=0;vis[1]=false; for(i=1;i<=n;i++) { min=maxcost;k=1; for(j=1;j<=n;j++) if(vis[j]&&min>dist[j]) { min=dist[j]; k=j; } if(min!=maxcost) res+=min; vis[k]=false; for(j=1;j<=n;j++) { if(vis[j]&&dist[j]>g[k][j]) dist[j]=g[k][j]; } } printf("%.2lf/n",res); } int main() { int i,x,y; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%lf%lf",&dis[i].x,&dis[i].y); solve_dis(); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); g[x][y]=g[y][x]=0; } prim(); return 0; }