poj 2728 二分图
2017-01-18 22:42
190 查看
第一次接触二分,然后还是感觉有点迷迷糊糊,额,以后学二分的时候再拿出来看看吧。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; #define INF 9999999999 #define MAXN 1005 struct node { double x,y,h; }Point[MAXN]; double dis[MAXN][MAXN],c[MAXN][MAXN]; double h[MAXN][MAXN]; int n; double prim()//这个prim理解的还是蛮深刻 { int i,j,k; double ans=0.0,mina; int vis[MAXN]; double d[MAXN]; for(i=0;i<n;i++) { d[i]=c[0][i]; vis[i]=0; } d[0]=1; vis[0]=1; for(i=1;i<n;i++) { mina=INF; for(j=0;j<n;j++) if(!vis[j]&&d[j]<mina) { mina=d[j]; k=j; } ans+=mina; vis[k]=1; for(j=0;j<n;j++) if(!vis[j]&&d[j]>c[k][j]) d[j]=c[k][j]; } return ans; } int main() { int i,j; double maxc,minc,maxl,minl,mid; while(scanf("%d",&n),n) { memset(Point ,0,sizeof(Point)); memset(h,0,sizeof(h)); memset(dis,0,sizeof(dis)); memset(c,0,sizeof(c)); maxc=-INF; minc=INF; maxl=-INF; minl=INF; for(i=0;i<n;i++) scanf("%lf %lf %lf",&Point[i].x,&Point[i].y,&Point[i].h); for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) { h[i][j]=h[j][i]=abs(Point[i].h-Point[j].h); dis[i][j]=dis[j][i]=sqrt((Point[i].x-Point[j].x)*(Point[i].x-Point[j].x)+(Point[i].y-Point[j].y)*(Point[i].y-Point[j].y)); if(maxc<dis[i][j]) maxc=dis[i][j]; if(minc>dis[i][j]) minc=dis[i][j]; if(maxl<h[i][j]) maxl=h[i][j]; if(minl>h[i][j]) minl=h[i][j]; } double head=minl/maxc;//大概范围 double last=maxl/minc; while(last-head>1e-5)//二分 { mid=(head+last)/2; for(int i=0;i<n-1;i++) for(j=i+1;j<n;j++) { c[i][j]=c[j][i]=h[i][j]-mid*dis[i][j]; } if(prim()<=0.0) last=mid; else head=mid; } printf("%.3f\n",head); } return 0; }
相关文章推荐
- poj 2728 二分图
- poj 2728 二分图
- poj 2728 二分图
- poj 2728 二分图
- poj 2728 二分图
- poj 2728 二分图
- poj 2728 二分图
- POJ 2060 最小路径覆盖 二分图
- POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)
- POJ 2728 Desert King 01分数规划 最优比率生成树
- POJ 2594--Treasure Exploration【二分图 && 最小路径覆盖 && 点可以重复走 && 传递闭包】
- POJ 2728 Desert King(最优比率生成树) prim+二分
- POJ 1904 King's Quest 强连通分量+二分图增广判定
- POJ3189 Steady Cow Assignment(二分图多重匹配)
- POJ 1469 COURSES(二分图最大匹配)
- POJ 2446 Chessboard(二分图最大匹配)
- poj 2942 Knights of the Round Table(双连通分量+tarjan+二分图判定)
- POJ 1274 The Perfect Stall(二分图最大匹配)
- poj 1422 二分图最小路径覆盖
- POJ-3041 匈牙利算法 二分图最大匹配