UVa 10397 Connect the Campus (Kruskal+补全最小生成树)

来源:互联网 发布:淘宝购物车服务器出错 编辑:程序博客网 时间:2024/05/28 09:33
#include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<climits>#include<queue>#include<vector>#include<set>#include<map>#include<cstring>#include<string>using namespace std;int N,M,E;const int INF=100000000;const int maxn=750+10;const int maxe=750*750+10;int p[maxn];struct Point{double x,y;Point(double x=0.0,double y=0.0):x(x),y(y){}};struct edge{int u,v;double cost;edge(int u=0,int v=0,double cost=0.0):u(u),v(v),cost(cost){}};edge es[maxe];Point point[maxn];int used[maxn][maxn];bool cmp(const edge& e1,const edge& e2){return e1.cost<e2.cost;}int find(int x){return p[x]==x ? x:p[x]=find(p[x]);}double Kruskal(){sort(es,es+E,cmp);for(int i=0;i<N;i++)p[i]=i;double res=0;for(int i=0;i<E;i++){edge e=es[i];int x=find(e.u);int y=find(e.v);if(x!=y){res+=e.cost;p[x]=y;}}return res;}int main(){while(~scanf("%d",&N)){memset(used,0,sizeof(used));for(int i=0;i<N;i++){scanf("%lf%lf",&point[i].x,&point[i].y);}E=0;scanf("%d",&M);for(int i=0;i<M;i++){int u,v;scanf("%d%d",&u,&v);u--;v--;es[E++]=edge(u,v,0);used[u][v]=1;used[v][u]=1;}for(int i=0;i<N;i++)for(int j=i+1;j<N;j++){if(used[i][j])continue;else{double d=sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));es[E++]=edge(i,j,d);}}printf("%.2lf\n",Kruskal());}return 0;}

0 0
原创粉丝点击