hdu 1162
2016-08-24 20:20
141 查看
include<cstdio> #include<iostream> #include<string.h> #include<cmath> #define maxn 105 #define inf 9999999 struct node { double x,y; }stu[maxn]; int vis[maxn],n;//用来表示点是否在集合里 double mincost[maxn];//用来记录从集合出来到每个点的最小距离 double mapp[maxn][maxn]; using namespace std; double get_len(node a,node b) { return sqrt(pow(a.x-b.x,2.0)+pow(a.y-b.y,2.0)); } void build_map() { for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { double len=get_len(stu[i],stu[j]); mapp[i][j]=mapp[j][i]=(i==j)?0:len; } } } void init() { memset(vis,0,sizeof(vis)); } double minn(double x,double y) { if(x-y>0) return y; else return x; } void prim() { fill(mincost,mincost+n+1,inf); mincost[1]=0; double res=0; while(1) { int v=-1; for(int i=1;i<=n;i++) if(!vis[i]&&(v==-1||mincost[i]<mincost[v])) v=i;//找出离集合最近的点 if(v==-1) break; vis[v]=1; res+=mincost[v]; for(int i=1;i<=n;i++) mincost[i]=minn(mincost[i],mapp[v][i]); } printf("%.2f\n",res); } int main() { while(~scanf("%d",&n)) { init(); for(int i=1;i<=n;i++) scanf("%lf %lf",&stu[i].x,&stu[i].y); build_map(); prim(); } return 0; }
相关文章推荐
- hdu1162 Eddy's picture 最小生成树 prim
- HDU 1162 Eddy's picture(最小生成树-Prim)
- hdu 1162 Eddy's picture
- 杭电Hdu 1162 Eddy's picture
- hdu-1162
- HDU 1162 Eddy's picture(点连通:最小生成树)
- hdu 1162 Eddy's picture
- hdu 1162 最小生成树
- hdu 1162
- hdu 1162 Eddy's picture
- HDU 1162 Eddy's picture
- hdu 1162(最小生成树)
- HDU 1162 Eddy's picture MST(基础)
- hdu 1162 && hdu 1875
- hdu 1162 Eddy's picture
- hdu 1162 Eddy's picture(最小生成树)
- hdu 1162 Eddy's picture (最小生成树)
- HDU1162-Eddy's picture
- HDU 1162 Eddy's picture
- hdu 1162(最小生成树kruskal)