hdu 1875 畅通工程再续 最小生成树
2014-04-27 23:18
429 查看
题目地址:hdu1875
直接求出符合要求的最小生成树就可以了。
代码:
直接求出符合要求的最小生成树就可以了。
代码:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; struct edge { int u; int v; int w; }; struct Point { int x; int y; Point(int x=0,int y=0):x(x),y(y) {} }; typedef Point Vector; Vector operator-(Point A,Point B) { return Point(A.x-B.x,A.y-B.y); } int Length2(Point A) { return A.x*A.x+A.y*A.y; } double Length(Point A) { return sqrt(A.x*A.x+A.y*A.y); } Point p[205]; edge e[50000]; int fa[205]; int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);} bool edge_cmp(edge a,edge b) { return a.w<b.w; } int n,m; int cc; void init() { for(int i=0;i<n;i++) { fa[i]=i; } cc=n; } double kruskal() { double ans=0; sort(e,e+m,edge_cmp); for(int i=0;i<m;i++) { if(e[i].w>1000000||e[i].w<100) continue; int x=find(e[i].u); int y=find(e[i].v); if(x!=y) { fa[x]=y; ans+=sqrt(e[i].w)*100; cc--; } } return ans; } int main() { int T; cin>>T; while(cin>>n) { init(); for(int i=0;i<n;i++) { scanf("%d%d",&p[i].x,&p[i].y); } int cnt=0; for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) { e[cnt].u=i; e[cnt].v=j; e[cnt].w=Length2(p[i]-p[j]); cnt++; } m=cnt; double ans=kruskal(); if(cc==1) { printf("%.1f\n",ans); } else{ cout<<"oh!"<<endl; } } }
相关文章推荐
- hdu 1875 畅通工程再续 最小生成树
- hdu 1875 畅通工程再续 (最小生成树)
- HDU ~ 1875 ~ 畅通工程再续 (最小生成树)
- HDU 1875 畅通工程再续 prim算法 最小生成树
- HDU 1875 畅通工程再续(水最小生成树)
- HDU 1875 畅通工程再续(最小生成树-Kruskal)
- HDU 1875 畅通工程再续(最小生成树-Kruskal算法)
- HDU 1875 畅通工程再续(最小生成树 kruskal)
- hdu 1875 畅通工程再续(最小生成树,prim)
- HDU - 1875 畅通工程再续(最小生成树)
- HDU 1875 畅通工程再续 (prim最小生成树)
- HDU 1875 畅通工程再续 最小生成树(简单题)
- hdu 1875 畅通工程再续 最小生成树prim
- hdu 1875 畅通工程再续 (最小生成树)
- HDU 1875 畅通工程再续 最小生成树
- hdu1875——畅通工程再续(最小生成树)
- HDU 1875 畅通工程再续(最小生成树)
- hdu-1875-畅通工程再续-最小生成树
- 【解题报告】 HDU 1875 畅通工程再续 Kruskal最小生成树 一点关于浮点型在计算机中储存的分析
- HDU 1875 畅通工程再续 有限制的最小生成树