查找一个图中所有树算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

思路:

1.使用堆栈列出所有可能的支路,因为树中支路个数为n-1。

2.判断支路是否包含所有节点,包含则为树。

核心函数:

/**

* 功能:获得图的所有树

* 参数:图的关联矩阵

* 返回:所有树的数组(以节点形式存放)

*/

Matrix GetAllTrees(const Matrix& m)

{

Matrix AllTrees;

vector Branchs;

int BranchNum= m[0].size();

//初始化可选支路堆栈

for(int i=0;i

Branchs.push_back(i);

do

{

if(IsTree(m,Branchs)) //如果这些支路能构成树,添加到返回数组中

AllTrees.push_back(Branchs);

} while(GetNextBranch(Branchs,BranchNum)); //获得下一个可用支路,找不到则结束

return AllTrees;

}

程序源代码:

#include

#include

#include

#include

#include

#include

using namespace std;

typedef vector > Matrix;

Matrix GetAssociatedMatrix()

{

int NoteNum,BranchNum;

cout<<"节点个数:";

cin>>NoteNum;

cout<<"支路个数:";

cin>>BranchNum;

Matrix M(NoteNum);

for(Matrix::iterator it= M.begin();it!= M.end() ; ++it)

(*it).resize(BranchNum);

int NoteBegin,NoteEnd;

for(int j=0;j

{

cout<<"支路"<

scanf("%d-%d",&NoteBegin,&NoteEnd);

assert(NoteBegin<= NoteNum&& NoteEnd<= NoteNum&& NoteBegin>= 0 && NoteEnd>= 0);//check

M[NoteBegin-1][j] = M[NoteEnd-1][j] = 1; //fill

}

return M;

}

void PrintAssociatedMatrix(const Matrix& m)

{

cout<

for(Matrix::size_type i=0;i

{

for(Matrix::size_type j=0;j

cout<

cout<

}

}

bool IsTree(const Matrix& m,const vector& Branchs) {

vector flag(m.size());

fill(flag.begin(),flag.end(),false);

for(vector::size_type i=0;i

{

for(Matrix::size_type j=0;j

{

if(m[j][ Branchs[i] ] == 1)

flag[j]= true;

}

}

for(vector::size_type j=0;j

{

if(!flag[j])

return false;

}

return true;

}

bool NextBranch(vector& Branchs,int MaxValue)

{

if(Branchs.empty()) return false;

if(Branchs.back() < MaxValue)

{

Branchs.back()++;

return true;

}

else

{

Branchs.pop_back();

return NextBranch(Branchs,MaxValue-1);

}

}

bool GetNextBranch(vector& Branchs, int BranchNum)

{

int BranchLength= Branchs.size();

int MaxValue= BranchNum- 1;

if(NextBranch(Branchs,MaxValue))

{

//add others

相关文档
最新文档