在我的最小生成树的Prim算法的模板 基础上增加一个vis数组用于区分节点是否已加入集合T中。这里不能使用节点的min_dis为0作为该节点是否加入T中,因为题目中给出了已经相连的边,而我们将其权值设为了0,需要另加数组判断。
另一个注意点是这里Prim不一定需要执行循环N-1次,同样因为有边权初始化为0。及时终止循环可以稍微提高效率。
我的解题代码如下:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define Distance double
#define INF 1000000
#define MAXN 750
double x[MAXN],y[MAXN];
Distance dis[MAXN][MAXN];
Distance min_dis[MAXN];
//int nearest_v[MAXN];
int vis[MAXN];
Distance Prim(int v0, int N)
{
//init
for(int i=0; i min_dis[i])
{
md = min_dis[i];
nv = i;
}
}
total_dis += md;
min_dis[nv] = 0;
vis[nv] = 1;
for(int i=0; i dis[i][nv])
{
min_dis[i] = dis[i][nv];
// nearest_v[i] = nv;
}
}
int ok = 0;
for(int i=0; i> N)
{
for(int i=0; i> M;
int na,nb;
for(int i=0; i