标签:
Prim....似乎没有考虑多点共线也能A.....
4 2 3 0 0 1 0 0 -1 1 -1 0
3.41
/* ***********************************************
Author :CKboss
Created Time :2015年08月17日 星期一 21时13分29秒
File Name :HDOJ4463.cpp
************************************************ */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const double inf=1e30;
const int maxn=100;
int n;
double g[maxn][maxn];
double dist[maxn];
bool vis[maxn];
double prim()
{
for(int i=0;i<100;i++) { dist[i]=inf; vis[i]=false; }
dist[0]=0;
double sum=0;
for(int i=0;i<n;i++)
{
int mark=-1;
double mindist=inf;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dist[j]<mindist)
{
mark=j; mindist=dist[j];
}
}
if(mark==-1) return inf;
sum+=mindist; vis[mark]=true;
for(int j=0;j<n;j++)
{
if(!vis[j]&&g[mark][j]<dist[j])
{
dist[j]=g[mark][j];
}
}
}
return sum;
}
int P,Q,N;
struct Point
{
double x,y;
void toString()
{
printf("(%lf,%lf)\n",x,y);
}
}pt[maxn],sP,sQ;
double Dist(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d",&N)!=EOF&&N)
{
scanf("%d%d",&P,&Q);
P--; Q--; n=0;
for(int i=0,x,y;i<N;i++)
{
scanf("%d%d",&x,&y);
if(i==P) sP.x=x,sP.y=y;
else if(i==Q) sQ.x=x,sQ.y=y;
else pt[n].x=x,pt[n].y=y,n++;
}
n++;
for(int i=0;i<n-1;i++)
{
g[i][n-1]=g[n-1][i]=min(Dist(pt[i],sP),Dist(pt[i],sQ));
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1;j++)
{
g[i][j]=g[i][j]=Dist(pt[i],pt[j]);
}
}
double ans=prim()+Dist(sP,sQ);
printf("%.2lf\n",ans);
}
return 0;
}
版权声明:来自: 码代码的猿猿的AC之路 http://blog.csdn.net/ck_boss
标签:
原文地址:http://blog.csdn.net/ck_boss/article/details/47733285