/*EOJ 2614*/ #include<iostream> using namespace std; #define maxn 102 #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) int x[maxn],y[maxn]; int dist[maxn][maxn],best[maxn],pre[maxn]; bool visit[maxn]; int maxbetween[maxn][maxn]; int n; void calc() { for(int i=0;i<n;i++) { dist[i][i]=0; for(int j=0;j<i;j++) dist[i][j]=dist[j][i]=abs(x[i]-x[j])+abs(y[i]-y[j]); } } int prim() { int i,j,k; int ans=0,smin; for(i=0;i<n;i++) for(j=0;j<n;j++) maxbetween[i][j]=0; for(i=0;i<n;i++) { visit[i]=0; best[i]=dist[0][i]; pre[i]=0; //maxbetween[0][i]=maxbetween[i][0]=dist[0][i]; } visit[0]=1; for(i=1;i<n;i++) { smin=INT_MAX; for(j=0;j<n;j++) { if(!visit[j] && best[j]<smin) { smin=best[j]; k=j; } } for(j=0;j<n;j++) { if(visit[j]) { maxbetween[j][k]=maxbetween[k][j]=max(maxbetween[j][pre[k]],smin);// } } visit[k]=1; ans+=smin; for(j=0;j<n;j++) { if(!visit[j] && dist[k][j]<best[j]) { best[j]=dist[k][j]; pre[j]=k; } } } return ans; } int secondprim(int total) { int ans=INT_MAX; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(i!=j && i!=pre[j] && j!=pre[i]) ans=min(ans,total-maxbetween[i][j]+dist[i][j]); } return ans; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d%d",&x[i],&y[i]); calc(); int total=prim(); int t=secondprim(total); printf("%d\n",total); if(t==total) printf("Yes\n"); else printf("No\n"); } return 0; }
|