POJ 2728 Desert King

news/2024/7/3 20:02:12

POJ_2728

    最优比率生成树问题,黑书上有详细的介绍,在求的时候可以直接二分K,也可以先假定一个K然后求得一个新的K,如此反复迭代下去。

    对于这个题而言,如果直接二分的话,大概二分50次就可以保证精度了,而迭代的话大概10次就可以保证精度了,所以迭代的效率还是高一些。

View Code 直接二分
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define MAXD 1010
#define INF 0x3f3f3f3f
using namespace std;
int N, vis[MAXD];
double dis[MAXD], x[MAXD], y[MAXD], z[MAXD], bet[MAXD][MAXD];
double sqr(double x)
{
    return x * x;
}
void init()
{
    int i, j;
    for(i = 0; i < N; i ++)
        scanf("%lf%lf%lf", &x[i], &y[i], &z[i]);
    for(i = 0; i < N; i ++)
        for(j = i + 1; j < N; j ++)
            bet[i][j] = bet[j][i] = sqrt(sqr(x[i] - x[j]) + sqr(y[i] - y[j]));
}
double prim(double K)
{
    int i, j, k;
    double m, ans = 0, t;
    memset(vis, 0, sizeof(vis));
    fill(dis, dis + N, INF);
    dis[0] = 0;
    for(i = 0; i < N; i ++)
    {
        m = INF;
        for(j = 0; j < N; j ++)
            if(!vis[j] && dis[j] < m)
                m = dis[k = j];
        vis[k] = 1;
        ans += dis[k];
        for(j = 0; j < N; j ++)
            if(!vis[j] && (t = fabs(z[k] - z[j]) - K * bet[k][j]) < dis[j])
                dis[j] = t;
    }
    return ans;
}
void solve()
{
    int i;
    double min = 0, max = INF, mid, ans;
    for(i = 0; i < 50; i ++)
    {
        mid = (min + max) / 2;
        ans = prim(mid);
        if(ans < 0)
            max = mid;
        else
            min = mid;
    }
    printf("%.3f\n", mid);
}
int main()
{
    for(;;)
    {
        scanf("%d", &N);
        if(!N)
            break;
        init();
        solve();
    }
    return 0;
}
View Code 迭代求解
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define MAXD 1010
#define INF 0x3f3f3f3f
using namespace std;
int N, vis[MAXD], pre[MAXD];
double dis[MAXD], x[MAXD], y[MAXD], z[MAXD], bet[MAXD][MAXD];
double sqr(double x)
{
    return x * x;
}
void init()
{
    int i, j;
    for(i = 0; i < N; i ++)
        scanf("%lf%lf%lf", &x[i], &y[i], &z[i]);
    for(i = 0; i < N; i ++)
        for(j = i; j < N; j ++)
            bet[i][j] = bet[j][i] = sqrt(sqr(x[i] - x[j]) + sqr(y[i] - y[j]));
}
double prim(double K)
{
    int i, j, k;
    double m, zt = 0, lt = 0, t;
    memset(vis, 0, sizeof(vis));
    fill(dis, dis + N, INF);
    dis[0] = 0, pre[0] = 0;
    for(i = 0; i < N; i ++)
    {
        m = INF;
        for(j = 0; j < N; j ++)
            if(!vis[j] && dis[j] < m)
                m = dis[k = j];
        vis[k] = 1;
        lt += bet[pre[k]][k], zt += fabs(z[pre[k]] - z[k]);
        for(j = 0; j < N; j ++)
            if(!vis[j] && (t = fabs(z[k] - z[j]) - K * bet[k][j]) < dis[j])
                dis[j] = t, pre[j] = k;
    }
    return zt / lt;
}
void solve()
{
    int i;
    double ans = 0;
    for(i = 0; i < 10; i ++)
        ans = prim(ans);
    printf("%.3f\n", ans);
}
int main()
{
    for(;;)
    {
        scanf("%d", &N);
        if(!N)
            break;
        init();
        solve();
    }
    return 0;
}

转载于:https://www.cnblogs.com/staginner/archive/2012/05/14/2499051.html


http://www.niftyadmin.cn/n/673106.html

相关文章

中国概念股周五早盘几乎全线下跌

http://www.sina.com.cn 2007年09月07日 23:26 新浪科技新浪科技讯 美国东部时间9月7日11:25(北京时间9月7日23:25)消息&#xff0c;由于前美联储主席格伦格林斯潘(Alan Greenspan)称当前形势与1987年股市崩盘时不乏相似之处&#xff0c;以及美国八月就业人数意外下滑&#xf…

ajax实现mvc模式

自从使用了SHH2的mvc模式后现在喜欢什么都搞个mvc模式&#xff0c;根据mvc的架构确实不错 在ajax中实现mvc模式&#xff1a; M(模型)&#xff1a;由代表服务器端响应的对象充当&#xff0c;模型复杂从服务器读取数据&#xff0c;并负责通知控制器将数据更新&#xff08;一般由X…

开盘前1.5秒下单可追涨停股

因为盛传有新资产注入&#xff0c;中远洋(601919)自7月25日停牌9月4日复牌以来&#xff0c;已连续两天开盘即封死涨停&#xff0c;证券分析人士认为其还应有两个涨停板。这种情况下&#xff0c;如果股民还想买入该股票&#xff0c;是否还有机会&#xff1f;如何操作才可实现&am…

开发杀手级企业应用10规则

卓越的企业级 App 要7*24小时在线&#xff0c;保持机警&#xff0c;能帮助员工抓住每一个机会。下面就来看一下如何构建。 你也许认为你和你的团队都已经拥有了个人电脑。 但是根据 Lextech Global Services&#xff08;一家移动 app 设计与开发公司&#xff09;的 CEO Alex Br…

股票中的K线理论

K线理论 -------------------------------------------------------------------------------- 碟型 1&#xff0e;型态分析 碟型的股价与成交量变动情形和圆形反转型态差不多&#xff0c;标准的碟型是以一连串一个以上的圆形底的型态出现&#xff0c;后一个的平均价格要比前一…

hbase表结构设计研究

因为一直在做hbase的应用层面的开发&#xff0c;所以体会的比较深的一点是hbase的表结构设计会对系统的性能以及开销上造成很大的区别&#xff0c;本篇文章先按照hbase表中的rowkey、columnfamily、column、timestamp几个方面进行一些分析。最后结合分析如何设计一种适合应用的…

PHP成员变量作用域的限制-private

使用PHP编写个类,我们应该尽量避免动态改变类的成员变量,而将成员变量作用于定位private,使用get和set方法来获取这些成员变量,如 1 <html>2 <body>3 <?php4 class Man {5 private $name;6 7 …

资产注入概念股

600676&#xff0c;交运股份收购控股股东相关资产上海交运集团公司.600246&#xff0c;万通先锋收购万通时尚股权。600528&#xff0c;中铁二局收购集团公司相关资产。600820&#xff0c;隧道股份对高桥随道机械增资。600547&#xff0c;山东黄金收购集团公司相关资产。000562&…