最小生成树 poj2349
来源:互联网 发布:陕西广电网络员工待遇 编辑:程序博客网 时间:2024/05/17 03:54
题目来源http://poj.org/problem?id=2349
我不得不说我要凌乱啦!
我从一开始都是对大致题意明白但是对一些小细节很不明白,包括现在!那个P给的是卫星频道数,但是为什么要求的是第p个长的边而不是第P+1个边,能过完全是靠给的测试实例然后猜的,真是越来越乱啦!
看题就知道这道题可以用的是最小生成数,因为点比较密集,所以采用的是Prime算法!
AC的算法:
#include<iostream>#include<cmath>using namespace std;int Max=888888;double tree[505][505];double array[505];bool vis[505];typedef struct fun{double x,y;}rr;fun a[505];void prim(int n){ vis[0]=true; int i,j,k,l=0; double low[505]; for(i=1; i<n; i++) low[i]=tree[0][i]; for(i=1; i<=n-1; i++) { double min=Max; j=0; for(k=1; k<n; k++) if(low[k]<min && vis[k]==false)//每一次记录的都是最小的啊 { min=low[k]; j=k; } array[l++]=min; vis[j]=true; for(k=1; k<n; k++) if(tree[j][k]<low[k] && vis[k]==false) low[k]=tree[j][k]; }}int cmp(const void *a,const void *b){return *(double *)a>*(double *)b?-1:1;}int main(){int T,p,n,i,j;cin>>T;while(T--){cin>>p>>n;for(i=0; i<n; i++)for(j=0; j<n; j++)tree[i][j]=Max;for(i=0; i<n; i++){cin>>a[i].x>>a[i].y;vis[i]=false;}//建立树的for(i=0; i<n; i++){for(j=i+1; j<n; j++)tree[i][j]=tree[j][i]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));}prim(n);qsort(array,n,sizeof(double),cmp);printf("%.2lf\n",array[p-1]);}return 0;}
接下来的是我经常用的那个最慢的Prime算法,是O(n^3),是刚学算法是自己想的,虽然这道题的数据不多,但是还是超时拉!
#include<iostream>#include<cmath>using namespace std;typedef struct fun{int x,y;}rr;fun a[505];bool vis[505];int b[505];int cmp(const void *a,const void *b){return *(int *)b-*(int *)a;}int main(){int i,j,T,p,t;cin>>T;while(T--){cin>>p>>t;for(i=0; i<t; i++){ //getchar();getchar();cin>>a[i].x>>a[i].y;vis[i]=false;}vis[0]=true;int jilu,n,max; n=0; while(1){max=1000000000;for(i=0; i<t; i++){if(vis[i]==false)continue;for(j=0; j<t; j++){if(vis[j]==true || j==i)continue;if((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y)<max) { max=(a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y); jilu=j;}}}vis[jilu]=true; b[n++]=max;b[n]=0;if(n==t-1)break;}qsort(b,t-1,sizeof(int),cmp);double m=sqrt((double)b[p-1]);printf("%.2lf\n",m);}return 0;}
- 最小生成树 poj2349
- poj2349(最小生成树)
- POJ2349最小生成树
- POJ2349最小生成树
- POJ2349->最小生成树
- POJ2349(最小生成树)
- 最小生成树(prim)--poj2349
- poj2349 Arctic Network 最小生成树,kruskal
- POJ2349&ZOJ1914--Arctic Network【最小生成树】
- poj2349 Arctic Network(最小生成树)
- [poj2349 Arctic Network]最小生成树
- POJ2349 Arctic Network 最小生成树
- poj2349:Arctic Network(最小生成树)
- POJ2349 Arctic Network(最小生成树,Kruskal)
- poj2349 Arctic Network 最小生成树
- POJ2349—最小生成树的Kruskal和Prim实现
- POJ2349 最小生成树(Prim更适合稠密图)
- poj2349——Arctic Network(最小生成树+prim)
- C#中常见的控件及功能(一)
- Java基础_toString
- 吾爱破解论坛元旦开放注册
- 2012- 16-23
- log4j的使用
- 最小生成树 poj2349
- 20121223-命令与征服3-基本战术介绍
- C++中string
- 20121223-命令与征服全面变更
- Ant整合Junit固定方式
- 美女被“干爹”骗了
- C++ 模板
- 排序(传地址值)
- android开发的问题(一)左右滑动屏幕实现activity的切换