hdu 1875
prim算法,用double,我第一次用float wa,看了别人代码改成double就过了。
#include<stdio.h> #include<math.h> #define N 110 #define max 9999999 double g[N][N]; void prim(int n) { int i,j,u,flag,mark[N]; double dis[N],cost,min; for(i=0;i<n;i++) { mark[i]=0; dis[i]=g[0][i]; } mark[0]=1; cost=0; flag=1; for(i=1;i<n;i++) { min=max; for(j=1;j<n;j++) if(!mark[j]&&min>dis[j]) { u=j; min=dis[j]; } if(min==max||min<10) { flag=0; break; } mark[u]=1; cost+=min; for(j=1;j<n;j++) if(!mark[j]&&dis[j]>g[u][j]) dis[j]=g[u][j]; } if(flag) printf("%.1f\n",100*cost); else printf("oh!\n"); } int main() { int i,j,m,n,x[N],y[N]; double dis,x2,y2; scanf("%d",&m); while(m--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d%d",&x[i],&y[i]); for(i=0;i<n;i++) for(j=0;j<=i;j++) { x2=(x[i]-x[j])*(x[i]-x[j]); y2=(y[i]-y[j])*(y[i]-y[j]); dis=sqrt(x2+y2); if(dis<10||dis>1000) g[j][i]=g[i][j]=max; else g[i][j]=g[j][i]=dis; } prim(n); } return 0; }