LA 5717枚举+最小生成树回路性质
1 /*LA 5717 2 《训练指南》P343 3 最小生成树的回路性质 4 在生成的最小生成树上,新增一条边e(u,v) 5 若原图上u到v的路径的最大边大于e,则删除此边,加上e,否则不变。 6 7 若原图上u到v的路径的最大边的产生:BFS/DFS都可 ,nm的复杂度,从每个点出发,找到每条边,更新最大即可 8 */ 9 10 #include<iostream> 11 #include<string.h> 12 #include<stdio.h> 13 #include<stdlib.h> 14 #include<cmath> 15 #include<algorithm> 16 #include<queue> 17 #include<stack> 18 #include<set> 19 #include<map> 20 #define LL unsigned long long 21 #define maxn 1010 22 #define INF 99999 23 using namespace std; 24 25 double X[maxn]; 26 double Y[maxn]; 27 int Peo[maxn]; 28 int p[maxn]; 29 double L;//最小生成树总长度 30 double MaxDis[maxn][maxn]; 31 int n,cnt; 32 33 double nextnum() 34 { 35 double x; 36 scanf("%lf",&x); 37 return x; 38 } 39 int nextint() 40 { 41 int x; 42 scanf("%d",&x); 43 return x; 44 } 45 46 struct Edge 47 { 48 double u,v,dis; 49 bool operator<(const Edge&x)const 50 { 51 return dis<x.dis; 52 } 53 void print() 54 { 55 cout<<"u="<<u<<","<<"v="<<v<<","<<"dis="<<dis<<endl; 56 } 57 } e[maxn*maxn]; 58 59 vector<Edge>edges;//存储新图的边 60 vector<int>G[maxn];//记录临街的边号 61 62 double Dis(int i,int j) 63 { 64 double x1=X[i],x2=X[j],y1=Y[i],y2=Y[j]; 65 return (sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))); 66 } 67 68 int findx(int x) 69 { 70 if (p[x]==x) return x; 71 else return p[x]=findx(p[x]); 72 } 73 74 void merge(int x,int y) 75 { 76 int px=findx(x); 77 int py=findx(y); 78 p[px]=py; 79 } 80 81 void init() 82 { 83 cin>>n; 84 cnt=0;L=0; 85 for(int i=1; i<=n; i++) 86 { 87 X[i]=nextnum();//坐标值实数 88 Y[i]=nextnum(); 89 Peo[i]=nextint(); 90 } 91 for(int i=1; i<=n; i++) 92 for(int j=1; j<=n; j++) 93 { 94 if (i==j) continue; 95 e[cnt++]=(Edge){i,j,Dis(i,j)};//建图 96 } 97 } 98 99 void prim()//最小生成树&&构建新的图 100 { 101 for(int i=1;i<=n;i++) G[i].clear(); 102 edges.clear(); 103 for(int i=1; i<=n; i++) p[i]=i; 104 sort(e,e+cnt); 105 106 for(int i=0; i<cnt; i++) 107 { 108 int u=e[i].u,v=e[i].v; 109 double dis=e[i].dis; 110 int pu=findx(u),pv=findx(v); 111 if (pu==pv) continue; 112 L+=dis; 113 merge(u,v); 114 edges.push_back((Edge){u,v,dis}); 115 G[u].push_back(edges.size()-1); 116 edges.push_back((Edge){v,u,dis}); 117 G[v].push_back(edges.size()-1); 118 119 if (edges.size()==2*(n-1)) break; 120 } 121 } 122 typedef pair<int,double> Node;//<上一个点,由起点到上一个点的通路上的最大值> 123 void max_dis()//找到最小生成树上的任意两点之间的通路的最大的边的长度,网上大多数版本是DFS实现,故写了BFS 124 { 125 memset(MaxDis,0,sizeof(MaxDis)); 126 bool mark[maxn]; 127 for(int i=1;i<=n;i++) 128 { 129 memset(mark,0,sizeof(mark)); 130 queue<Node>Q; 131 Q.push(make_pair(i,0)); 132 while(!Q.empty()) 133 { 134 Node Kn=Q.front();Q.pop(); 135 int u=Kn.first;double dis=Kn.second; 136 if (mark[u]) continue; 137 mark[u]=true; 138 int m=G[u].size(); 139 for(int j=0;j<m;j++) 140 { 141 Edge e=edges[G[u][j]]; 142 int v=e.v; 143 if (MaxDis[i][v]>0) continue;//important,小技巧,因为存的是双向边,所以必须消除回退的影响 144 dis=MaxDis[i][v]=max(Dis(u,v),dis); 145 Q.push(make_pair(v,dis)); 146 } 147 } 148 } 149 } 150 151 int main() 152 { 153 int cas=0; 154 cin>>cas; 155 while(cas--) 156 { 157 init(); 158 prim(); 159 max_dis(); 160 double ans=0; 161 for(int i=2; i<=n; i++)//枚举每一条道路 162 for(int j=1; j<i; j++) 163 { 164 int A=Peo[i]+Peo[j]; 165 double B=L-MaxDis[i][j]; 166 ans=max(ans,A/B); 167 } 168 printf("%.2lf\n",ans); 169 } 170 return 0; 171 }
转载于:https://www.cnblogs.com/little-w/p/3595422.html
LA 5717枚举+最小生成树回路性质相关推荐
- [HAOI2006]旅行comf(枚举+最小生成树)
题意:传送门 题解:枚举+最小生成树 附上代码: #include<bits/stdc++.h>using namespace std;const int maxn=5e2+5; cons ...
- Uva 1151 Buy or Build 二进制枚举+最小生成树
题目描述 万维网(WWN)是一家运营大型电信网络的领先公司. WWN希望在Borduria建立一个新的网络,您需要帮助WWN确定如何以最低的总成本设置其网络.有几个本地公司运营着一些小型网络(以下称为 ...
- LA 2402 (枚举) Fishnet
题意: 正方形四个边界上分别有n个点,将其划分为(n+1)2个四边形,求四边形面积的最大值. 分析: 因为n的规模很小,所以可以二重循环枚举求最大值. 求直线(a, 0) (b, 0) 和直线(0, ...
- UESTC - 1636 梦后楼台高锁,酒醒帘幕低垂(枚举+最小生成树)
题意 给你一张图, 求1到n的路径,边权最大值-边权最小值最小的差ans 输出这个ans 思路来源 https://blog.csdn.net/ProLightsfxjh/article/detail ...
- 对应生成树的基本回路_数据结构与算法——最小生成树
1 引言 在之前的文章中已经详细介绍了图的一些基础操作.而在实际生活中的许多问题都是通过转化为图的这类数据结构来求解的,这就涉及到了许多图的算法研究. 例如:在 n 个城市之间铺设光缆,以保证这 n ...
- jzoj100042-保留道路【最小生成树,图论】
正题 题目大意 一张无向图,求剩下一些边使图联通且wG∗max{gVi}+wS∗max{sVi}wG*max\{g_{V_i}\}+wS*max\{s_{V_i}\}wG∗max{gVi}+wS∗ ...
- Prim最小生成树算法
在一个具有几个顶点的连通图G中,如果存在子图G'包含G中所有顶点和一部分边,且不形成回路,则称G'为图G的生成树,代价最小生成树则称为最小生成树. 许多应用问题都是一个求无向连通图的最小生成树问题.例 ...
- 数据结构之图的应用:最小生成树MST(prime算法和Kruskal算法)
图的应用:最小生成树 最小生成树的定义: 最小生成树的性质: Prime算法:(贪心算法思想) Prime算法的代码实现原理: Prime算法的实现代码: Prime算法的性能: Kruskal算法: ...
- 图论 —— 生成树 —— 增量最小生成树
[概述] 所谓最小增量生成树问题,即:给定包含 n 个点的空图,依次加入 m 条带权边,每次加入一条边,就输出当前图中最小生成树的权值,如果没有生成树,则输出无解 求解最小增量生成树的方法是:根据最小 ...
最新文章
- 免费公开课 | 基于定制数据流技术的AI计算加速
- 全新 Sitecore Experience Cloud™ 助推数字体验转型
- 音视频技术:视频质量评价方法简介
- DS18B20 理解与操作源码
- python 程序开发以及推荐机制设计
- linux单个core的线程,正确使用Core Data多线程的3种方式
- WTM5.0发布,全面支持.net5
- linux查看文件从底部开始,linux中怎样从底部向上查看log文件
- Hadoop生态圈-Ambari控制台功能简介
- 华为手机芯片断供,有没有可能回收旧手机解决目前困境?
- 前端面试题集锦(二)之CSS部分
- Python - 列表解析式/生成器表达式
- SCT芯洲DC-DC-SCT2430是一款输出电流高达3.5A的高功率密度全集成同步降压DCDC转换器。其输入电压范围为3.8V到40V,替代TPS54340
- 关于DevExpress XtraReport 表格单合并单元格完整教程
- oracle12c 重启服务,OBIEE12c的服务启动/关闭命令
- 做强信息产业 拓宽智慧城市发展路径
- 如何播放html文件类型,m3u8格式如何播放
- android html 文件怎么打开,Android可以用Html查看器打开txt文件
- android打开图库,Android 7.0 以上通过系统图库打开图片的方法
- 1小时销量突破50万台!小金刚Redmi Note 10系列力创首销新纪录
热门文章
- Tim Berners-Lee重新分散的新Web SOLID简介
- travis ci_如何使用Travis CI和GitHub进行Web开发工作流程
- token拦截器阻止连接_如何防止广告拦截器阻止您的分析数据
- hung-yi lee_p10_分类/概率生成模型
- 物联网技术与应用(第1-2课时)(cont.)
- 制作ui设计作品集要注意哪些
- kerberos java实现,基于kerberos实现jaas登录
- matlab实验是啥,matlab实验心得体会
- 编写自己的SpringBoot-starter
- Android APP全面屏适配技术要点