我受不鸟最小生成树的题目了,怎么看着都这么水,难道是我挑的题水? 这个题我都没有去调试,编译成功之后就提交了,果然AC.... 题中给出所有点的坐标,这样便可知道所有点之间的距离,用临界矩阵存,顺便用prim,水阿~ #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> const double INF = 99999999; double dist[101]; double mat[101][101]; int flag[101]; struct point { double x,y; } a[101],t; int main(void) { int n,i,j,now,start=1; double min,sum; while( scanf("%d",&n) && n ) { for( i = 1; i <= n; i++ ) scanf("%lf%lf",&a[i].x,&a[i].y); for( i = 1; i <= n; i++ ) for( j = 1; j <= n; j++ ) { if( i==j ) mat[i][j] = 0; else { mat[i][j] = sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x) +(a[i].y-a[j].y)*(a[i].y-a[j].y)); } } for( i = 1; i <= n; i++) { dist[i] = INF; flag[i] = 0; } dist[now=1] = 0; flag[1] =1; for( i= 1,sum=0; i <n ;i++) { for( j = 1; j <= n; j++) if( !flag[j] && dist[j] > mat[now][j] ) dist[j] = mat[now][j]; for( j = 1,min = INF; j <= n; j++) if( !flag[j] && dist[j] < min ) min = dist[now = j]; flag[now]=1; sum += min; } if( start == 1) printf("Case #%d:/n",start++); else printf("/nCase #%d:/n",start++); printf("The minimal distance is: %.2lf/n",sum); } return 0; }