无向图转换成最小生成树

本文介绍了如何使用C++实现无向图转换为最小生成树的算法,包括Prim和Kruskal两种方法。代码中包含了数据结构Edge和AdjacencyMatrix的定义,以及相关算法的实现,如设置边的权重、检查矩阵是否有效、Prim和Kruskal算法等。
摘要由CSDN通过智能技术生成

//这段代码还没有优化,第一个就是 在kruskal方法中的iswrong可以有两个地方改进

//一个是不使用 int[][] 而使用 map

//第二个就是 加进 wrongarr时可以使用 位运算来解决 (可以按这个思路去研究,本人还没有试过)

//isok() 可以使用位 运算来解决 假设有三个点  则 000 添加一个点 001  再添加 101 ... 根据他们的位置就可以判断出来了#include <cstdlib>
#include <iostream>

#define TITLE_T cout << "###############################" << endl;
#define TITLE_I cout << "                   无向图转换成最小生成树" << endl;

using namespace std;

struct Edge {
int fr;
int to;
int value;

void copy(struct Edge *p)
{
this->fr = p->fr;
this->to = p->to;
this->value = p->value;
}
};


/

class AdjacencyMatrix
{
public:
AdjacencyMatrix(int cn, int en);
~AdjacencyMatrix();

inline int setvalue(int pref, int next, int value);
int check() const;
int convert_prim(int logflag = 0);
int convert_kruskal(struct Edge *p_e, int logflag = 1);
void print_m() const;
void print_t() const;
private:
int citynum;
int edgenum;
int **matrix;
struct Edge *s_edge;

int iswrong(int ** wrongarr, struct Edge * p_e, int index); //kruskal
int isok(int *okarr, int fr, int to); //kruskal
};


AdjacencyMatrix::AdjacencyMatrix(int cn, int en)
:citynum(cn), edgenum(en)
{
int ** temp = new int*[cn];
for(int i = 0; i < cn; i++)
{
temp[i] = new int[cn];
}

for(int j = 0; j < cn; j++)
{
for(int k = 0; k < cn; k++)
{
if( j == k )
temp[j][j] = 0;
else
temp[j][k] = -1;
}
}
matrix = temp;
s_edge = NULL;
}


inline int AdjacencyMatrix::setvalue(int pref, int next, int value)
{
if( value <= 0 || pref >= citynum || next >= citynum || pref == next || *(*(matrix+pref)+next) > 0 )
return 0;

matrix[pref][next] = value;
matrix[next][pref] = value;

return value;
}


AdjacencyMatrix::~AdjacencyMatrix()
{
for(int i = 0; i < citynum; i++)
delete[] matrix[i];

delete[] matrix;

if( s_edge )
delete[] s_edge;
}


void AdjacencyMatrix::print_m() const
{
cout << "AdjacencyMatrix Info:/n";
for(int i = 0; i < citynum; i++)
{
for(int j = 0; j < citynum; j++)
cout << matrix[i][j] << "/t";
cout << endl;
}
}


void AdjacencyMatrix::print_t() const
{
if( s_edge )
{
cout << "min tree Info:/n";
for(int i = 0; i < citynum-1; i&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值