问题大概思路,摘选自网络:我就不说题意了,为了使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