hdu4081 最小生成树的变形,通过此题理解了什么时候不能用优先队列实现prim算法

问题大概思路,摘选自网络:我就不说题意了,为了使A/B最大,就应该是B越小,故可以先求出n个点的最小生成树。因此,可以枚举每一条边,假设最小生成树的值是B, 而枚举的那条边长度是edge[i][j],  如果这一条边已经是属于最小生成树上的,那么最终式子的值是A/(B-edge[i][j])。如果这一条不属于最小生成树上的, 那么添加上这条边,就会有n条边,那么就会使得有了一个,为了使得它还是一个生成树,就要删掉环上的一棵树。 为了让生成树尽量少,那么就要删掉除了加入的那条边以外,权值最大的那条路径。 假设删除的那个边的权值是Max[i][j], 那么就是A/(B-Max[i][j]).



最近几天刚学了prim算法,总是感觉不如用优先队列实现的prim算法好用,于是该题,我依然使用prim算法,然而一直出问题

先贴出代码

这是第一次写的代码:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <queue>
#include <cstring>
#include <vector>
#define S(a) ((a)*(a))


using namespace std;

int N; // N个村庄
const int V_MAX = 1005;
typedef struct node
{
    int x, y;
    int persons;
}node;

node vertex[V_MAX];

float cost[V_MAX][V_MAX];

typedef struct edge
{
    friend bool 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值