UVa 10397 Connect the Campus (Kruskal+补全最小生成树)
2015-08-05 10:33
441 查看
#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; }
相关文章推荐
- git: clone、checkout、多个 ssh key、 修改commit信息(--amend)
- 发送邮件的简单实现 加附件不成功的话就是遭到了系统的退信
- 【JDBC发展史】从JDBC1.0到JDBC4.0
- arm-linux挂载nfs文件系统
- Filter
- *Binary Tree Level Order Traversal
- HTML embed标签使用方法和属性详解
- 排序
- 编写一个属于自己的sax解析xml文档
- string.h 中常用函数
- 解决没有Win10推送图标问题
- 简单易用的word转pdf转换软件
- java循环|分支结构
- (C#)工厂方法模式
- [分享]牛牛图片查看器[仿QQ图片查看器]及大致原理说明
- 个人收录
- C++ 运算符笔记
- YII 1.0 (7) 登录信息调取 session使用
- 南邮 OJ 1181 字符排序
- OC习题 通讯录 (知识点: 字典 封装 字符串 数组 枚举)