#include<stdio.h>
#include<string.h>
#include<math.h>
#define SIZE 1010
#define INF 0xffffff
typedef struct node
{
double x,y;
};
node vertex[1010];
double graph[1010][1010];
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void initi(int n)
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
graph[i][j]=INF;
}
double Prim(int m)
{
int minLoc,i,j,vis[SIZE];
double minCost[SIZE],minW;
memset(vis,0,sizeof(vis));
/**vis[i]=1表示i顶点已加入最小生成树中*/
vis[1]=1;
minCost[1]=0;
/**初始化,更新与起点的权值*/
for(i=2;i<=m;i++)
minCost[i]=graph[1][i];
for(i=2;i<=m;i++)
{
double min=INF;
minLoc=0;
/**找出当前最小树中的顶点与未加入顶点中权值最小的边*/
for(j=2;j<=m;j++)
if(!vis[j]&&minCost[j]<min)
{
minLoc=j;
min=minCost[j];
}
/**将当前找到构成最小边的顶点加入树中*/
vis[minLoc]=1;
minW+=min;
/**更新最小树中与未加入顶点的权值*/
for(j=2;j<=m;j++)
if(!vis[j]&&minCost[j]>graph[minLoc][j])
minCost[j]=graph[minLoc][j];
}
return minW;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int i,j,u,v;
for(i=1;i<=n;i++)
scanf("%lf%lf",&vertex[i].x,&vertex[i].y);
initi(n);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
graph[i][j]=graph[j][i]=dis(vertex[i],vertex[j]);
for(j=0;j<m;j++)
{
scanf("%d%d",&u,&v);
graph[u][v]=graph[v][u]=0.0;
}
printf("%.2lf\n",Prim(n));
}
return 0;
}
POJ 3625(Building Roads)
最新推荐文章于 2019-06-09 21:45:09 发布