#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int n , m , a , b , c;
double map[105][105];
double dist[105] , ans1 , ans2;
int vis[105] , use[105][105] , p[205];
double d[105][105];
double x[60] , y[60];
int t1 , t2;
void prim(){
int tid;
double tmin;
ans1 = 0;
memset(vis , 0 , sizeof(vis));
memset(dist , 0 , sizeof(dist));
memset(p , -1 , sizeof(p));
for(int i = 1 ; i <= n ; i ++){
dist[i] = inf;
}
dist[1] = 0;
p[1] = -1;
for(int i = 0 ; i < n; i ++){
//printf("i = %d\n" , i);
tid = -1;
tmin = inf;
for(int j = 1 ; j <= n ; j ++){
if(vis[j] == 0 && tmin > dist[j]){
tmin = dist[j];
tid = j;
}
}
ans1 += tmin;
//printf("tmin = %d\n" , tmin);
vis[tid] = 1;
for(int j = 1 ; j <= n ; j ++){
if(vis[j] == 0 && dist[j] > map[tid][j]){
dist[j] = map[tid][j];
p[j] = tid;
//printf("j = %d pos = %d\n" , j , tid);
}
}
}
return ;
}
void dfs(int v){
for(int u = 1 ; u <= n ; u ++){
if(vis[u] == 0 && p[u] == v){
vis[u] = 1;
for(int x = 1 ; x <= n ; x ++){
if(vis[x] == 1 && x != u){
d[x][u] = d[u][x] = max(d[x][v] , map[u][v]);
}
}
dfs(u);
}
}
return ;
}
double distances(int i , int j){
return sqrt((y[j] - y[i]) * (y[j] - y[i]) + (x[j] - x[i]) * (x[j] - x[i]));
}
void Second_MST(){
//printf("use = %d\n" , use[t1][t2]);
if(use[t1][t2] == 0) ans2 = ans1;
else{
ans2 = ans1 + map[t1][t2] - d[t1][t2];
}
}
int main(){
int t;
while(~scanf("%d" , &n) && n){
scanf("%d%d" , &t1 , &t2);
memset(map , inf , sizeof(map));
memset(use , 0 , sizeof(use));
for(int i = 1 ; i <= n ; i ++){
scanf("%lf%lf" , &x[i] , &y[i]);
}
for(int i = 1 ; i <=n ; i ++){
for(int j = 1 ; j <=n ; j ++){
use[i][j] = 1;
if(i == j) map[i][j] = 0;
else {
map[i][j] = distances(i , j);
}
}
}
prim();
//printf("%lf " , ans1);
memset(vis , 0 , sizeof(vis));
memset(d , 0 , sizeof(d));
vis[1] = true;
dfs(1);
for(int i = 1 ; i <= n ; i ++){
if(p[i] != -1){
use[p[i]][i] = use[i][p[i]] = 0;
}
}
Second_MST();
printf("%.2lf\n" , ans2);
}
}
hdu 4463 Outlets (次小生成树)
最新推荐文章于 2021-04-09 08:11:34 发布