POJ|POJ2728 Desert King

01分数规划 题目传送门
【POJ|POJ2728 Desert King】题目大意:有 nn 个点,两点之间都有道路,道路有两个权值: len=l e n = 两点之间距离, cost=c o s t = 两点高度之差。求使 ∑cost∑len∑ c o s t ∑ l e n 最小的生成树的该比值。
这题就是求最优比例生成树。二分比值 midm i d ,把每条边的权值改为 cost[i]?mid?len[i]c o s t [ i ] ? m i d ? l e n [ i ] ,跑最小生成树和0比较即可。
代码(用G++交):

#include #include #include #include #define N 1005 #define eps 1e-8 #define sqr(x) ((x)*(x)) #define abs(x) ((x)>0?(x):-(x)) using namespace std; typedef double DB; struct edge{DB d,c; } ed[N][N]; int n,x[N],y[N],z[N]; bool f[N]; DB d[N]; inline bool pd(DB x){ memset(f,false,sizeof(f)); f[1]=true; DB ret=0; for (int i=1; i<=n; i++) d[i]=ed[1][i].c-x*ed[1][i].d; for (int i=1; i<=n-1; i++){ DB mn=1e50; int now; for (int j=1; j<=n; j++) if (!f[j]&&d[j]eps) if (pd(mid=(l+r)/2)) r=mid-1e-6; else l=mid+1e-6; printf("%.3f\n",l); } return 0; }

    推荐阅读