HDU4081 Qin Shi Huang's National Road System(次小生成树)
2015-11-29 21:41
459 查看
枚举作为magic road的边,然后求出A/B。
A/B得在大概O(1)的时间复杂度求出,关键是B,B是包含magic road的最小生成树。
这么求得:
先在原图求MST,边总和记为s,顺便求出MST上任意两点路径上的最长边d[i][j]。
当(u,v)是magic road时,
如果它在原本的MST上,则B就等于s-原(u,v)的权,而原(u,v)的权其实就是d[u][v];
如果它不在原本的MST上,则B就等于s-d[u][v]+0。
总之就是一个式子:B=s-d[u][v]。
于是,在原图的MST基础上可以在O(1)的时间复杂度求出任意一边作为magic road的情况下的MST。
A/B得在大概O(1)的时间复杂度求出,关键是B,B是包含magic road的最小生成树。
这么求得:
先在原图求MST,边总和记为s,顺便求出MST上任意两点路径上的最长边d[i][j]。
当(u,v)是magic road时,
如果它在原本的MST上,则B就等于s-原(u,v)的权,而原(u,v)的权其实就是d[u][v];
如果它不在原本的MST上,则B就等于s-d[u][v]+0。
总之就是一个式子:B=s-d[u][v]。
于是,在原图的MST基础上可以在O(1)的时间复杂度求出任意一边作为magic road的情况下的MST。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define MAXN 1111 #define INF (1<<30) int n,G[MAXN][MAXN]; int lowcost[MAXN],nearvex[MAXN],T[MAXN],NT,maxedge[MAXN][MAXN]; double prim(){ memset(maxedge,0,sizeof(maxedge)); for(int i=1; i<n; ++i) lowcost[i]=INF; lowcost[0]=0; nearvex[0]=0; NT=0; double res=0; for(int i=0; i<n; ++i){ int u=-1,mincost=INF; for(int v=0; v<n; ++v){ if(lowcost[v]!=-1 && lowcost[v]<mincost){ mincost=lowcost[v]; u=v; } } for(int i=0; i<NT; ++i) maxedge[T[i]][u]=maxedge[u][T[i]]=max(maxedge[T[i]][nearvex[u]],mincost); T[NT++]=u; res+=sqrt(mincost); lowcost[u]=-1; for(int v=0; v<n; ++v){ if(lowcost[v]!=-1 && lowcost[v]>G[u][v]){ lowcost[v]=G[u][v]; nearvex[v]=u; } } } return res; } int main(){ int t,x[MAXN],y[MAXN],p[MAXN]; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0; i<n; ++i) scanf("%d%d%d",x+i,y+i,p+i); for(int i=0; i<n; ++i){ for(int j=i+1; j<n; ++j){ G[i][j]=G[j][i]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); } } double mst=prim(),res=-1; for(int i=0; i<n; ++i){ for(int j=i+1; j<n; ++j){ res=max(res,(p[i]+p[j])/(mst-sqrt(maxedge[i][j]))); } } printf("%.2f\n",res); } return 0; }
相关文章推荐
- 记录-移动端网页触摸内容滑动js插件
- 编写一个计算前100位斐波那契数的函数。
- 简述strcpy、sprintf与memcpy的区别
- hdoj5578Friendship of Frog
- web开发--- 牛腩总:细节篇
- 创建socket函数的第三个参数的意义
- Switch语句
- 将表转javabean(基于mysql)
- UML图之构件图和部署图
- java线程通信,解决线程之间的交互问题
- 第一周博客
- ACM算法总结及刷题参考
- 哈理工练习赛 杭电 HDU Prime Path 1973 poj 3126 Prime Path
- GCD详解及实现
- Hive安装(三)之奇怪的错误
- some apis
- PHP缓存技术的使用说明
- JAVA Socket 编程---Socket 和 ServerSocket
- 20135321余佳源——信息安全系统设计基础第十二周学习总结
- 数据结构基础7.3:堆排序