HDU 1875 畅通工程再续【最小生成树,Prime算法+Kruskal算法】
来源:互联网 发布:kali linux ssh 编辑:程序博客网 时间:2024/06/01 20:59
畅通工程再续
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24151 Accepted Submission(s): 7808
Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
Sample Input
2210 1020 2031 12 21000 1000
Sample Output
1414.2oh!
Author
8600
Source
2008浙大研究生复试热身赛(2)——全真模拟
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1875
还是最小生成树,但是有点改变,理解题目是关键“2个小岛之间的距离不能小于10米,也不能大于1000米”
这句话的意思是小岛之间的原始距离。。。
Prime算法AC代码:46ms
/**"2个小岛之间的距离不能小于10米,也不能大于1000米"不是任意2个小岛,只是有桥的相连两个小岛间的距离限制,不用考虑全部连通后的任意两个小岛间的距离.果然想太多了....*/#include <iostream>#include <cmath>#include <cstdio>using namespace std;const int INF=0x3f3f3f3f;struct node{ double x,y;} t[105];double a[105][105];double dis[105];bool vis[105];int n;void Prime(){ for(int i=0; i<n; i++) { dis[i]=a[0][i]; vis[i]=false; } dis[0]=0; vis[0]=true; double ans=0; for(int i=1; i<n; i++) { int p=-1; double minn=INF; for(int j=0; j<n; j++) { if(!vis[j]&&dis[j]<minn) minn=dis[p=j]; } if(p==-1) { cout<<"oh!"<<endl; return; } vis[p]=true; ans+=minn; for(int j=0; j<n; j++) { if(!vis[j]&&dis[j]>a[p][j]) dis[j]=a[p][j]; } } printf("%.1lf\n",ans*100);}int main(){ int T; cin>>T; while(T--) { cin>>n; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) if(i==j) a[i][j]=0; else a[i][j]=INF; } for(int i=0; i<n; i++) { cin>>t[i].x>>t[i].y; } for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(i==j) a[i][j]=0; else { a[i][j]=sqrt((t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y)); if(a[i][j]<10||a[i][j]>1000)//此处注意 a[i][j]=INF; } } } Prime(); } return 0;}
Kruskal算法AC代码1:530ms
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int INF=0x3f3f3f3f;int fa[105];int n,m;struct point{ double x,y;} t[105];struct node{ int s,e; double w;} a[5000+5];int Find(int x){ if(fa[x]==x) return x; return fa[x]=Find(fa[x]);}bool cmp(node a,node b){ return a.w<b.w;}double Kruskal(){ for(int i=0; i<n; i++) fa[i]=i; sort(a,a+m,cmp); double ans=0; int cnt=n-1; for(int i=0; i<m; i++) { int x=Find(a[i].s); int y=Find(a[i].e); if(x!=y) { ans+=a[i].w; fa[x]=y; } } return ans;}int main(){ int T; cin>>T; while(T--) { cin>>n; for(int i=0; i<n; i++) { cin>>t[i].x>>t[i].y; } m=0; for(int i=0; i<n; i++) { for(int j=0; j<i; j++) { double d=sqrt((t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y)); if(d>=10&&d<=1000) { a[m].s=i; a[m].e=j; a[m++].w=d; } } } double ans=Kruskal(); int cnt=0; for(int i=0; i<n; i++) { if(fa[i]==i) cnt++; } if(cnt>1) cout<<"oh!"<<endl; else printf("%.1lf\n",ans*100); } return 0;}
Kruskal算法AC代码2: 530ms
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int INF=0x3f3f3f3f;int fa[105];int n,m;struct point{ double x,y;} t[105];struct node{ int s,e; double w;} a[5000+5];int Find(int x){ if(fa[x]==x) return x; return fa[x]=Find(fa[x]);}bool cmp(node a,node b){ return a.w<b.w;}void Kruskal(){ for(int i=0; i<n; i++) fa[i]=i; sort(a,a+m,cmp); double ans=0; int cnt=0; for(int i=0; i<m; i++) { int x=Find(a[i].s); int y=Find(a[i].e); if(x!=y) { ans+=a[i].w; fa[x]=y; cnt++; } if(cnt==n-1) { printf("%.1lf\n",ans*100); return; } } cout<<"oh!"<<endl;}int main(){ int T; cin>>T; while(T--) { cin>>n; for(int i=0; i<n; i++) { cin>>t[i].x>>t[i].y; } m=0; for(int i=0; i<n; i++) { for(int j=0; j<i; j++) { double d=sqrt((t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y)); if(d>=10&&d<=1000) { a[m].s=i; a[m].e=j; a[m++].w=d; } } } Kruskal(); } return 0;}
0 0
- HDU 1875 畅通工程再续【最小生成树,Prime算法+Kruskal算法】
- HDU 1389 继续畅通工程【最小生成树,Prime算法+Kruskal算法】
- hdu 1875 畅通工程再续(kruskal算法计算最小生成树)
- 【HDU 1875】畅通工程再续(最小生成树,kruskal算法)
- HDU 1875 畅通工程再续(最小生成树-Kruskal算法)
- hdu 畅通工程再续(最小生成树)(Prim算法 && Kruskal算法)
- hdu1875 畅通工程再续(最小生成树kruskal算法)
- HDU 1879 继续畅通工程(最小生成树 Kruskal算法)
- hdu 1863 畅通工程 (最小生成树kruskal 算法)
- HDU 1863 畅通工程 kruskal算法 最小生成树
- hdu 1875 畅通工程再续(最小生成树Kruskal)
- HDU 1875 畅通工程再续【最小生成树Kruskal】
- HDU-1875 畅通工程再续-1162 - Eddy's picture(最小生成树,Kruskal 算法实现 )
- HDU1233 还是畅通工程(最小生成树模板题,Prime,kruskal算法)
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
- HDU 1233 还是畅通工程【最小生成树入门题,Kruskal算法+Prim算法】
- HDU 1233 还是畅通工程 最小生成树Kruskal算法和prim算法
- hdu 还是畅通工程 (基础)(最小生成树)(Prim算法 && Kruskal算法)
- A*算法的使用,
- 【探究jQuery】jQuery.extend 和 jQuery.fn.extend 的区别
- javascript中函数声明与函数表达式的一些认识
- Android Fragment + ViewPager 实现类微信 底部导航栏 和 显示消息提醒
- c++之vector
- HDU 1875 畅通工程再续【最小生成树,Prime算法+Kruskal算法】
- 算法基础知识科普:8大搜索算法之AVL树(下)
- Webservice脚本优化
- hdu--4857
- Linux系统中cgroup功能介绍
- iOS开发-调试网络限速(真机和模拟器)
- andriod color.xml
- char、varchar、nchar、nvarchar的区别
- POJ3259