#include "elementreduction.h" #include #include #include ElementReduction::ElementReduction(const QList &branchList):branchList(branchList) { } ElementReduction::~ElementReduction() { } void ElementReduction::doIt() { QHash > linkage; //先记录元件之间的连接关系 QHash idToBranch; foreach(BranchStruc* v,this->branchList) { idToBranch[v->id]=v; linkage[v->fromID].push_back(v); linkage[v->toID].push_back(v); } QDomDocument root; QDomElement element=root.createElement(this->branchList.at(2)->id); root.appendChild(element); this->buildTree(element,root,linkage,idToBranch); this->visited.remove(this->branchList.at(2)->id); this->buildTree2(element,root,linkage,idToBranch); QFile file("1.xml"); if(file.open(QFile::WriteOnly)) { // root.setContent(&file); QTextStream writer(&file); root.save(writer,4); file.close(); } //看看是不是每个都访问到了 foreach(BranchStruc* v,this->branchList) { if(!this->visited.contains(v->id)) { std::cout<<"unvisited "<id.toStdString()< >& linkage,QHash& idToBranch) { QString id=element.tagName(); if(this->visited.contains(id)) { // std::cout<<"visited "<id.toStdString()<visited[id]=0; BranchStruc * branch=idToBranch[id]; QString nextTo; nextTo=branch->toID; QVector nextVec; nextVec=linkage[nextTo]; foreach(BranchStruc *n,nextVec) { if(this->visited.contains(n->id)) { continue; } // std::cout<<"add "<id.toStdString()<id); element.appendChild(newEle); this->buildTree(newEle,root,linkage,idToBranch); } } void ElementReduction::buildTree2(QDomElement &element,QDomDocument &root,QHash >& linkage,QHash& idToBranch) { QString id=element.tagName(); if(this->visited.contains(id)) { std::cout<<"visited "<visited[id]=0; BranchStruc * branch=idToBranch[id]; QString nextFrom=branch->fromID; QVector nextFromVec; nextFromVec=linkage[nextFrom]; foreach(BranchStruc *n,nextFromVec) { if(this->visited.contains(n->id)) { continue; } // std::cout<<"add "<id.toStdString()<id); element.appendChild(newEle); this->buildTree2(newEle,root,linkage,idToBranch); } } void ElementReduction::visit(BranchStruc* branch,QHash >& linkage) { std::cout<<"visit "<id.toStdString()<visited.contains(branch->id)) // { // std::cout<<"visited "<id.toStdString()<visited[branch->id]=0; QString next; next=branch->toID; QVector nextVec; nextVec=linkage[next]; // std::cout<<"next length"<dispose) { // std::cout<<"disposed "<id.toStdString()<isZeroBranch)//是0阻抗 { std::cout<<"merge "<id.toStdString()<<" and "<id.toStdString()<toID=v->toID; v->dispose=true; foreach(BranchStruc* change,linkage[branch->toID]) { if(change->id==branch->id) { continue; } change->fromID=branch->toID; } } // std::cout<<"start to visit next"<id!=branch->id) { this->visit(v,linkage);//深度优先 } } } void ElementReduction::visit2(BranchStruc* branch,QHash >& linkage) { // std::cout<<"visit "<id.toStdString()<visited.contains(branch->id)) { std::cout<<"visited "<id.toStdString()<visited[branch->id]=0; QString next; next=branch->fromID; QVector nextVec; nextVec=linkage[next]; // std::cout<<"next length"<dispose) { // std::cout<<"disposed "<id.toStdString()<isZeroBranch)//是0阻抗 { std::cout<<"merge "<id.toStdString()<<" and "<id.toStdString()<fromID=v->fromID; v->dispose=true; foreach(BranchStruc* change,linkage[branch->fromID]) { if(change->id==branch->id) { continue; } change->toID=branch->fromID; } } // std::cout<<"start to visit next"<visit(v,linkage);//深度优先 } }