hdu4081秦始皇
来源:互联网 发布:辐射4显存低配优化补丁 编辑:程序博客网 时间:2024/06/18 05:27
http://acm.hdu.edu.cn/showproblem.php?pid=4081
我就不说题意了,为了使A/B最大,就应该是B越小,故可以先求出n个点的最小生成树。因此,可以枚举每一条边,假设最小生成树的值是B, 而枚举的那条边长度是edge[i][j], 如果这一条边已经是属于最小生成树上的,那么最终式子的值是A/(B-edge[i][j])。如果这一条不属于最小生成树上的, 那么添加上这条边,就会有n条边,那么就会使得有了一个环,为了使得它还是一个生成树,就要删掉环上的一棵树。 为了让生成树尽量少,那么就要删掉除了加入的那条边以外,权值最大的那条路径。 假设删除的那个边的权值是Max[i][j], 那么就是A/(B-Max[i][j]).
这题的关键也在于怎样求出次小生成树;
先用prim求出最小生成树T.在prim的同时,用一个矩阵max[u][v] 记录 在T中连结任意两点u,v的唯一的路中权值最大的那条边的权值.这是很容易做到的,因为prim是每次增加一个结点s, 而设已经标号了的结点集合为W, 则W中所有的结点到s的路中的最大权值的边就是当前加入的这条边.
#include<iostream>#include<cstring>#include<cmath>const int N=1010;const double inf=1e14;using namespace std;struct Point{ int x,y,z;}point[N];int n;double edge[N][N];int nearvex[N];//保存前驱double lowcost[N]; double sum;int used[N][N];int visited[N];double Max[N][N];//用来保存最小生成树中两点之间的权值最大的边void prim(int v0){ sum=0; memset(used,0,sizeof(used)); memset(visited,0,sizeof(visited)); memset(Max,0,sizeof(Max)); for(int i=1;i<=n;i++){ lowcost[i]=edge[v0][i]; nearvex[i]=v0; } visited[v0]=1; for(int i=1;i<n;i++){ double min=inf; int v=-1; for(int j=1;j<=n;j++){ if(!visited[j]&&lowcost[j]<min){ v=j,min=lowcost[j]; } } if(v!=-1){ sum+=lowcost[v]; used[v][nearvex[v]]=used[nearvex[v]][v]=1;//标记这条边已经是最小使用过// visited[v]=1; for(int k=1;k<=n;k++){ if(visited[k]&&k!=v){ //对于那些已经加入最小生成树的边,只要每次更新所有点到新加入的点之间的边权值最大值即可 Max[v][k]=Max[k][v]=(Max[k][nearvex[v]]>lowcost[v]?Max[k][nearvex[v]]:lowcost[v]); } if(!visited[k]&&edge[v][k]<lowcost[k]){ lowcost[k]=edge[v][k]; nearvex[k]=v; } } } }}int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&point[i].x,&point[i].y,&point[i].z); } for(int i=1;i<=n;i++){ edge[i][i]=0; for(int j=i+1;j<=n;j++){ double dis=sqrt(pow((point[i].x-point[j].x)*1.0,2)+pow((point[i].y-point[j].y)*1.0,2)); edge[i][j]=edge[j][i]=dis; } } prim(1); double r=-1; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)if(i!=j){ if(used[i][j]){ r=(r>(point[i].z+point[j].z)*1.0/(sum-edge[i][j])?r:(point[i].z+point[j].z)*1.0/(sum-edge[i][j])); }else if(!used[i][j]){ r=(r>(point[i].z+point[j].z)*1.0/(sum-Max[i][j])?r:(point[i].z+point[j].z)*1.0/(sum-Max[i][j])); } } } printf("%.2lf\n",r); } return 0;}
0 0
- hdu4081秦始皇
- hdu4081
- 次小生成树 hdu4081
- hdu4081(最小生成树变形)
- hdu4081 次小生成树变形
- 图论训练2A--hdu4081
- hdu4081(最小生成树变形,prim)
- UVA1494Qin Shi Huang's National Road System(LA5713)(HDU4081)
- hdu4081 Qin Shi Huang's National Road System
- hdu4081 Qin Shi Huang's National Road System
- hdu4081 最小树+DFS或者次小树的变形
- HDU4081 Qin Shi Huang's National Road System
- hdu4081---Qin Shi Huang's National Road System
- hdu4081 Qin Shi Huang's National Road System PRIM+dp
- hdu4081 Qin Shi Huang's National Road System
- hdu1102&hdu4081最小生成树,次小生成树
- HDU4081 Qin Shi Huang's National Road System
- HDU4081(Qin Shi Huang's National Road System)(2011 Asia Beijing Regional Contest)
- Javascript中最常用的55个经典技巧
- 第五周项目 5 友元类
- 泡泡堂、QQ堂游戏通信架构分析
- 【转】对信息学竞赛中调试方法的建议
- Android 调试工具集【转】
- hdu4081秦始皇
- Timer + ServletContext 实现web应用的任务调度
- 合肥软件开发手机软件开发移动app开 发微信开发
- Accessing the ASP.NET Web Configuration Tool in Visual Studio 2013
- Deep Learning初学材料
- 只进 ResultSet 不支持请求的操作。
- 【内部排序】三:希尔排序(Shell Sort)的多种实现(不断优化+源码)
- Android 实现视频录制播放
- 合肥app开发公司哪家好