POJ 2075

POJ2075是到PRIM练习题,但是很坑爹。有个很奇怪的问题就是:输出浮点数%.1f就过 %.1lf就不过。如果有人知道原因,请一定告知!不知道是不是.1f是四舍五入的 %.1lf是取floor的?
 
#include <cstdio>
#include <cstring>
#include <climits>

using std::memset;

const int MAX = 1005;

double totallength;
double map[MAX][MAX];
char house[MAX][30];
int n,m;

double prim()
{
    bool visit[MAX];
    double dis[MAX];
    memset(visit, 0, sizeof(visit));
    for(int i = 0 ; i < n; i++)
    dis[i] = -1;
    dis[0] = 0;
    double ans = 0;

    for(int i = 0 ; i< n; i++)
    {
        //find mingap
        double mindis = INT_MAX;
		int minindex = -1;
        for(int j = 0 ; j < n; j++)
        {
            if(!visit[j] && dis[j]!= -1 && mindis > dis[j])
            {
                mindis = dis[j];
                minindex = j;
            }
        }

        visit[minindex] = 1;
        ans += mindis;

        int from = minindex;
        for(int to = 0 ; to < n; to++)
        {
            if(visit[to])
            continue;

            if(map[from][to] == 0)
            continue;

            if(dis[to] == -1 || map[from][to] < dis[to])
            {
                dis[to] = map[from][to];
            }
        }
    }
    return ans;
}

int main()
{
    while(scanf("%lf", &totallength)!=EOF)
    {
        scanf("%d", &n);
        for(int i = 0 ; i< n; i++)
        scanf("%s", house[i]);

        scanf("%d", &m);
        for(int i = 0 ; i < m; i++)
        {
            char house1[30], house2[30];
            double length;
            scanf("%s %s %lf", &house1, &house2, &length);

            int house1index, house2index;
            for(int j = 0 ; j < n; j++)
            {
                if(strcmp(house1, house[j]) == 0)
                house1index = j;
            }

            for(int j = 0 ; j < n; j++)
            {
                if(strcmp(house2, house[j]) == 0)
                house2index = j;
            }

            map[house1index][house2index] = length;
            map[house2index][house1index] = length;
        }

        double ans = prim();
        if(ans > totallength)
        printf("Not enough cable\n");
        else
        printf("Need %.1f miles of cable\n", ans);
    }
}


 

 

转载于:https://www.cnblogs.com/wead-hsu/p/3712290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值