首页 > 代码库 > POJ2349 Arctic Network 最小生成树
POJ2349 Arctic Network 最小生成树
链接:
2349
题意:一个平面网络中 有M个卫星N个站点,每两个站点之间可以用通讯器联系或用卫星联系,用通讯器联系的花销和距离有关,用卫星联系则不需要花销。给出每个站点的坐标(x,y),求这个网络最小生成树的最大边。
题解:
M个卫星一共可以减去M-1条边,通过prim算法求出生成树中的所有(n-1)条边,通过排序,再减去(m-1)条权值最大的边 即可得到最小生成树中的最大边。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define maxx 9999999 double map[505][505]; double lowdis[505],loc[505][2]; int s,m,n; double ans[505]; double cmp(double a,double b) { return a<b; } void prim() { int i,j,pos,minn; for(i=1; i<=m; i++) lowdis[i]=map[1][i]; lowdis[1]=-1; for(i=1; i<m; i++) { minn=maxx; for(j=1; j<=m; j++) if(lowdis[j]!=-1&&lowdis[j]<minn) minn=lowdis[j],pos=j; ans[s++]=lowdis[pos]; lowdis[pos]=-1; for(j=1; j<=m; j++) if(lowdis[j]>map[pos][j]) lowdis[j]=map[pos][j]; } return; } int main() { int t,i,j; scanf("%d",&t); while(t--) { s=0; scanf("%d%d",&n,&m); for(i=1; i<=m; i++) scanf("%lf%lf",&loc[i][0],&loc[i][1]); for(i=1; i<=m; i++) for(j=i; j<=m; j++) { if(j==i) map[i][j]=maxx; else map[i][j]=map[j][i]=sqrt(pow(loc[i][0]-loc[j][0],2)+pow(loc[i][1]-loc[j][1],2)); } prim(); sort(ans,ans+s,cmp); if(s-n<0) cout<<0<<endl; else printf("%.2lf\n",ans[s-n]); } return 0; }
POJ2349 Arctic Network 最小生成树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。