查找一个图中所有树算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
思路:
1.使用堆栈列出所有可能的支路,因为树中支路个数为n-1。
2.判断支路是否包含所有节点,包含则为树。
核心函数:
/**
* 功能:获得图的所有树
* 参数:图的关联矩阵
* 返回:所有树的数组(以节点形式存放)
*/
Matrix GetAllTrees(const Matrix& m)
{
Matrix AllTrees;
vector
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 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 vector fill(flag.begin(),flag.end(),false); for(vector { for(Matrix::size_type j=0;j { if(m[j][ Branchs[i] ] == 1) flag[j]= true; } } for(vector { if(!flag[j]) return false; } return true; } bool NextBranch(vector { 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 { int BranchLength= Branchs.size(); int MaxValue= BranchNum- 1; if(NextBranch(Branchs,MaxValue)) { //add others