POJ 3625 Building Roads(Prim水题)

来源:互联网 发布:什么软件可以出书 编辑:程序博客网 时间:2024/06/05 06:08

。很水,不说话了,直接睇代码吧

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<queue>using namespace std;#define N 2010double x[N],y[N];double map[N][N],dist[N];bool vis[N];int n,m;double dis(double x,double y,double x1,double y1) {return sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));}double Prim(){double sum=0.0;int i,j;for(i=0;i<=n;i++){dist[i] = map[1][i];vis[i] = 0;}int u;for(i=0;i<=n;i++){double low = 99999999;u = 0;for(j=1;j<=n;j++){if( !vis[j] && dist[j] < low ){low = dist[j];u = j;}}if(low == 99999999)break;sum += low;vis[u] = true;for(j=1;j<=n;j++){if( !vis[j] && dist[j] > map[u][j] )dist[j] = map[u][j];}}return sum;}int main(){int i,j,u,v;while(~scanf("%d%d",&n,&m)){for(i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);for(i=1;i<=n;i++){for(j=i+1;j<=n;j++)map[i][j] = map[j][i] = dis(x[i],y[i],x[j],y[j]);}for(i=0;i<m;i++){scanf("%d%d",&u,&v);map[u][v] = map[v][u] = 0;}memset(vis,false,sizeof(vis));printf("%.2f\n",Prim());}return 0;}