题目链接:点击打开链接
prim算法模板题,需要自己求一下距离,还有一种方法是距离都保存x*x+y*y,10和1000比较时也相应的平方,这样保证前面都是整数运算,输出时在开方乘100。
大于10小于1000看成了大于等于小于等于,wa了n次
代码:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; struct node{ int x,y; node(){} node(int x,int y):x(x),y(y){} node operator - (node k){ return node(x-k.x,y-k.y); } }p[105]; double a[105][105]; double dis[105]; bool vis[105]; double res; const double inf=10000000; const double eps=1e-7; double len(node a,node b){ node t=a-b; return pow(double(t.x*t.x)+double(t.y*t.y),0.5); } bool prim(int n){ for(int i=1;i<=n;i++){ vis[i]=0; dis[i]=inf; } res=0;dis[1]=0; for(int i=1;i<=n;i++){ double tmp=inf;int k=0; for(int j=1;j<=n;j++){ if(!vis[j]&&tmp>dis[j]){ tmp=dis[j]; k=j; } } if(fabs(tmp-inf)<eps) { return 0; } res+=tmp; vis[k]=1; for(int j=1;j<=n;j++){ if(!vis[j]&&dis[j]>a[k][j]) dis[j]=a[k][j]; } } return 1; } int main(){ int T; cin>>T; while(T--){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>p[i].x>>p[i].y; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a[i][j]=len(p[i],p[j]); if(i==j) a[i][j]=0; else if(a[i][j]>1000||a[i][j]<10) a[i][j]=inf; } } if(prim(n))printf("%.1lf\n",res*100); else cout<<"oh!"<<endl; } return 0; }