2011-05-09 00:08:58 非常挫的代码·······最小生成树 #include<iostream> using namespace std; inline int abs(int x) { return x>0?x:-x; } inline int max(int a,int b) { return a>b?a:b; } inline int min(int a,int b) { return a<b?a:b; } struct City { int x, y; }city[50]; struct Road { int dis; bool f; }road[50][50]; bool flag[50]; int main() { int n,i,j,ii,jj,x,y,x1,y1,x2,y2; while (scanf("%d",&n)!=EOF) { int mi,res=0; for(i=0;i<n;i++) flag[i]=false; for(i=0;i<n;i++) { scanf("%d%d",&x,&y); city[i].x=x; city[i].y=y; } for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { x1=city[i].x; y1=city[i].y; x2=city[j].x; y2=city[j].y; if(x1!=x2&&y1!=y2) { road[i][j].dis=max(abs(x1-x2),abs(y1-y2)); } else if(x1==x2) { road[i][j].dis=(max(y1,y2)-min(y1,y2)+1)/2; } else { road[i][j].dis=(max(x1,x2)-min(x1,x2)+1)/2; } } } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) road[i][j].f=false; flag[0]=true; while (true) { mi=100000000; for(i=0;i<n;i++) { if(flag[i]==true) { for(j=0;j<i;j++) { if(road[j][i].dis<mi&&road[j][i].f==false) {mi=road[j][i].dis; jj=j;ii=i;} } for(j=i+1;j<n;j++) { if(road[i][j].dis<mi&&road[i][j].f==false) {mi=road[i][j].dis; jj=j;ii=i;} } } } road[min(ii,jj)][max(ii,jj)].f=true; flag[jj]=true; for(i=0;i<n;i++) if(!flag[i]) break; if(i>=n) break; } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { if(road[i][j].f&&road[i][j].dis>res) res=road[i][j].dis; } printf("%d/n",res); } return 0; }