poj 2349 最小生成树
2013-08-30 17:04
253 查看
传送门
题意:有p个点,s个卫星通讯器,p个点要能相互联络,其中持有卫星通讯器的可无限距离随意联络,其他则靠无线电,问无限电最小的工作范围要是多少。
思路:求出最小生成树,然后其中s-1条边可以不连,当然选择最长的不连啊,其实就是输出最小生成树的边中第n-p-1大的边,排下序就好。
题意:有p个点,s个卫星通讯器,p个点要能相互联络,其中持有卫星通讯器的可无限距离随意联络,其他则靠无线电,问无限电最小的工作范围要是多少。
思路:求出最小生成树,然后其中s-1条边可以不连,当然选择最长的不连啊,其实就是输出最小生成树的边中第n-p-1大的边,排下序就好。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int t,n,m; double x[505],y[505],p[505][505]; double ans[505],d[505]; int num; bool v[505]; double dis(int i,int j) { return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } void prim() { memset(v,0,sizeof(v)); for(int i=2;i<=n;i++)d[i]=p[1][i]; for(int j=1;j<n;j++) { int index=0; double mi=100000000; for(int i=2;i<=n;i++) { if(d[i]<mi&&!v[i]) { index=i; mi=d[i]; } } if(index) { v[index]=1; ans[num++]=d[index]; for(int i=2;i<=n;i++) { if(d[i]>p[index][i]&&!v[i])d[i]=p[index][i]; } } } } int main() { scanf("%d",&t); while(t--) { num=0; scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); for(int j=i-1;j>0;j--) { p[i][j]=p[j][i]=dis(i,j); } } prim(); sort(ans,ans+num); printf("%.2f\n",ans[num-m]); } return 0; }
相关文章推荐
- 【POJ 2349 最小生成树】
- prime算法生成最小生成树----poj2349
- POJ2349最小生成树
- poj 2349 最小生成数 允许k个孤立点-k已知-求点之间允许的距离的最小值
- POJ 2349 (最小生成树)
- POJ 2349 Arctic Network (最小生成树)
- POJ-2349 Arctic Network (最小生成树)
- POJ 2349 Arctic Network (最小生成树)
- 2349 poj &&uva 10369 Arctic Network【最小生成树】
- poj 2349 最小生成树
- POJ 2349 Arctic Network(最小生成树思想)
- Arctic Network POJ - 2349 (最小生成树Kruskal)
- poj 2349 (最小生成树 Prim)
- Prim最小生成树【poj 2349 Arctic Network;poj 1287 NetWorking】
- poj 2349 最小生成树
- poj 2349(最小生成树)
- poj 2349 Arctic Network 最小生成树
- POJ 2349 Arctic Network (最小生成树)
- poj 2349 Arctic Network(最小生成树的第k大边证明)
- POJ 2349————最小生成树