hdu 4081 最小生成树
2012-10-03 23:23
316 查看
先求出最小生成树,然后枚举树上的边,对于每条边“分别”找出这条割边形成的两个块中点权最大的两个
1.由于结果是A/B,A的变化会引起B的变化,两个制约,无法直接贪心出最大的A/B,故要通过枚举
2.不管magic road要加在哪里,加的边是否是最小生成树上的边,都会产生环,我们都要选择一条边删掉
注意删掉的边必须是树的环上的边,为了使结果最大,即找出最大的边
3.可以枚举两点,找出边,也可以枚举边,找出点,我是用后者,感觉比较容易写也好理解
1.由于结果是A/B,A的变化会引起B的变化,两个制约,无法直接贪心出最大的A/B,故要通过枚举
2.不管magic road要加在哪里,加的边是否是最小生成树上的边,都会产生环,我们都要选择一条边删掉
注意删掉的边必须是树的环上的边,为了使结果最大,即找出最大的边
3.可以枚举两点,找出边,也可以枚举边,找出点,我是用后者,感觉比较容易写也好理解
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <vector> using namespace std; #define N 1050 #define INF 1000000 struct point { double x,y; int num; }p ; int n; double map ,dist ,A,B; vector<int>vec ; double getdistance(point aa,point bb) { return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y)); } int pre ; void prim() { for(int i=1;i<=n;++i) dist[i]=INF*1.0; double min_edge; int min_p,now=1; for(int i=1;i<n;++i)// 这里dist 表示到达已经更新好的点集的最小距离 { min_edge=INF*1.0; for(int i=1;i<=n;++i) if(map[now][i]>0) { if(dist[i]>map[now][i]) dist[i]=map[now][i],pre[i]=now; } dist[now]=-1.0; for(int i=1;i<=n;++i) if(dist[i]>0&&dist[i]<min_edge) { min_edge=dist[i]; min_p=i; } vec[pre[min_p]].push_back(min_p); // 最小边有可能来自之前更新过的,这里WA vec[min_p].push_back(pre[min_p]); now=min_p; B+=min_edge; } } int vis ; int dfs(int u,int fa) { int max_num=p[u].num; int ret=u;int tt; for(int i=0;i<vec[u].size();++i) if(vec[u][i]!=fa) { tt=dfs(vec[u][i],u); if(max_num<p[tt].num) max_num=p[tt].num,ret=tt; } return ret; } int main () { //freopen("aa.txt","r",stdin); //freopen("bb.txt","w",stdout); int test;scanf("%d",&test); while(test--) { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].num); for(int i=1;i<=n;++i) { for(int j=i+1;j<=n;++j) map[i][j]=map[j][i]=getdistance(p[i],p[j]); map[i][i]=0.0; } for(int i=0;i<=n;++i) vec[i].clear(); B=0.0; memset(pre,-1,sizeof(pre)); prim(); double ans=-1.0; double res;int t1,t2; for(int i=1;i<=n;++i) for(int j=0;j<vec[i].size();++j) // 枚举边,对于这条割边两侧的连通图分别找出点权最大的点 { t1=dfs(i,vec[i][j]); t2=dfs(vec[i][j],i); res=(p[t1].num+p[t2].num)/(B-map[i][vec[i][j]]); if(res>ans) ans=res; } ans+=(1e-8); printf("%.2lf\n",ans); } //system("pause"); return 0; }
相关文章推荐
- hdu 4081 Qin Shi Huang's National Road System 最小生成树
- HDU 4081 Qin Shi Huang's National Road System 最小生成树+倍增求LCA
- HDU 4081 Qin Shi Huang's National Road System 最小/次小生成树的性质
- hdu-4081 Qin Shi Huang's National Road System(最小生成树+bfs)
- HDU 4081 Qin Shi Huang's National Road System(最小生成树,记录圈中最大边后暴力枚举)
- HDU 4081 Qin Shi Huang's National Road System 最小/次小生成树的性质
- HDU-4081 Qin Shi Huang's National Road System(最小生成树[Prim])
- HDU 4081 Qin Shi Huang's National Road System 最小生成树
- HDU 4081 Qin Shi Huang's National Road System(最小生成树/次小生成树)
- HDU 4081 Qin Shi Huang's National Road System 最小生成树
- HDU 4081 Peach Blossom Spring (最小生成树+dfs)
- HDU 4081 最小生成树变形
- Hdu 4081 最小生成树
- HDU 4081 最小生成树+dfs
- HDU 4081 Qin Shi Huang's National Road System(最小生成树/次小生成树)
- hdu 4081 最小生成树+树形dp
- HDU 4081 Qin Shi Huang's National Road System 最小生成树变形
- hdu 4081 Qin Shi Huang's National Road System 【最小生成树的变形】
- HDU 4081 Qin Shi Huang's National Road System(最小生成树+暴力枚举边)
- hdu 4081 Qin Shi Huang's National Road System(最小生成树+dp)2011 Asia Beijing Regional Contest