POJ 2349 Arctic Network(Prim/Kruskal)
来源:互联网 发布:大数据企业盈利模式 编辑:程序博客网 时间:2024/05/22 13:55
题目链接:
POJ 2349 Arctic Network
题意:
有n个村庄,需要这些村庄实现两两通信(连通)。
有两种通信方式:卫星通信无视距离。无线电通信距离不超过D。
已知可提供p颗卫星,由于这些通信是统一样式的,而且D越大成本越高。为了让成本最小,求出最小的D。
分析:
可提供p颗卫星,每个村庄使用一颗,也就是有p-1条边是不需要考虑的。
又因为将n个点连通,需要最少n-1条边。
所以最终就是要求最小生成树中第(n-1)-(p-1)条边的边长。(把边从小到大排序后)
//Kruskal Algorithm#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn=510;const int INF=0x3f3f3f3f;int T,p,n,tot;int pre[maxn];double ans;struct Point{ int x,y;}point[maxn];struct Edge{ int u,v; double w;}edge[maxn*maxn];void init(){ for(int i=0;i<maxn;i++) pre[i]=i;}int find(int x){ return pre[x]==x?x:pre[x]=find(pre[x]);}double Distance(struct Point a,struct Point b){ int xx=a.x-b.x; int yy=a.y-b.y; return sqrt(xx*xx+yy*yy);}bool cmp(struct Edge a,struct Edge b){ return a.w<b.w;}int main(){#ifdef LOCAL freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout);#endif scanf("%d",&T); while(T--) { init(); scanf("%d%d",&p,&n); for(int i=1;i<=n;i++) scanf("%d%d",&point[i].x,&point[i].y); tot=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { edge[tot].u=i; edge[tot].v=j; edge[tot].w=Distance(point[i],point[j]); tot++; } } sort(edge,edge+tot,cmp); //for(int i=0;i<tot;i++) // printf("edge[%d].u=%d edge[%d].v=%d edge[%d].w=%.2f\n",i,edge[i].u,i,edge[i].v,i,edge[i].w); int cnt=0;//cnt记录已经连通边数 for(int i=0;i<tot;i++) { int u=edge[i].u; int v=edge[i].v; int fu=find(u); int fv=find(v); //printf("u=%d v=%d fu=%d fv=%d\n",u,v,fu,fv); //printf("cnt=%d\n",cnt); if(fu==fv) continue; pre[fu]=fv; cnt++; if(cnt==n-p) { ans=edge[i].w; break; } } printf("%.2f\n",ans); } return 0;}
//Prim Algorithm#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn=510;const int INF=0x3f3f3f3f;int T,n,p;int vis[maxn];double dis[maxn],map[maxn][maxn];double ans[maxn];//ans数组记录最小生成树的各条边长struct Point{ int x,y;}point[maxn];double Distance(struct Point a,struct Point b){ double xx=a.x-b.x; double yy=a.y-b.y; return sqrt(xx*xx+yy*yy);}int main(){#ifdef LOCAL freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout);#endif scanf("%d",&T); while(T--) { scanf("%d%d",&p,&n); for(int i=1;i<=n;i++) scanf("%d%d",&point[i].x,&point[i].y); for(int i=1;i<=n;i++) { map[i][i]=0; for(int j=i+1;j<=n;j++) { map[i][j]=map[j][i]=Distance(point[i],point[j]); } }/* for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) printf("%.2f ",map[i][j]); printf("\n"); }*/ memset(vis,0,sizeof(vis)); vis[1]=1;//选取1作为开始点 for(int i=1;i<=n;i++) { dis[i]=map[1][i]; //printf("dis[%d]=%.2f ",i,dis[i]); } //printf("\n"); int tot=0; for(int i=1;i<n;i++) {//还需要连接n-1个点 int k=-1; double tmp=INF; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<tmp) { tmp=dis[j]; k=j; } } vis[k]=1; ans[tot++]=tmp; //printf("k=%d tmp=%.2f\n",k,tmp); for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]>map[k][j]) dis[j]=map[k][j]; //printf("dis[%d]=%.2f ",j,dis[j]); } //printf("\n"); } sort(ans,ans+tot); printf("%.2f\n",ans[n-p-1]);//因为边下标是从0开始的所以第n-p条边的下标是n-p-1 } return 0;}
0 0
- POJ 2349 Arctic Network(Prim/Kruskal)
- poj 2349 Arctic Network (prim)
- poj 2349 Arctic Network (prim算法)
- POJ 2349 Arctic Network(Prim)
- poj 2349 Arctic Network (kruskal)
- POJ 2349 Arctic Network (Kruskal) .
- [POJ 2349] Arctic Network Kruskal
- POJ 2349(Kruskal) Arctic Network
- POJ - 2349----Arctic Network(prim)
- zoj 1914 || poj 2349 Arctic Network【最小生成树 kruskal && prim】
- Arctic Network(POJ 2349)(最小生成树Kruskal)
- POJ 2349 ——Arctic Network(kruskal)
- zoj 1914 || poj 2349 Arctic Network(Prim~)
- poj 2349 Arctic Network prim算法做
- POJ 2349 Arctic Network(Prim算法)
- Arctic Network (Kruskal)
- ZOJ 1914 Arctic Network (kruskal + prim )
- poj 2349 Arctic Network 【最小生成树-Kruskal】
- HTML基础语法总结
- Adapter 适配器模式
- Linux中tmpfs
- HashMap和Hashtable的区别
- Spring2.5的基本配置
- POJ 2349 Arctic Network(Prim/Kruskal)
- IIrebboResuoH.213
- 大数据架构文章整理
- kafka配置说明
- LeetCodeOJ.ZigZag Conversion
- CSS3属性:width:fit-content 水平居中
- HttpClient和HttpURLConnection的区别
- Jquery对象常用方法
- 【Java】学习笔记