在无向图中查找最小环,就像需要查找一个蜂窝中所有孔洞,如果只查找数目,可以利用欧拉公式,若查找到所有环,需要更进一步的搜索。
方法:寻找到所有顶点的最短路径,对每一个顶点,取出环,循环删除顶点,输出所有最小环。
注意:拓扑图具有位置可变性,不影响图结构的拓扑变化。所以此方法,只能找到拓扑最小环,若想找到距离最小环,需要对边进行加权。
原文:找出无向图中所有环的算法。代码也转自于作者。
图片实例:
code:
bool findAllLoop(int argc, char* argv[]);
//查找所有路径的算法是成功的;但最短路径不能保证找到最小环
int main(int argc, char* argv[])
{
findAllLoop(argc, argv);
return 0;
}
bool findAllLoop(int argc, char* argv[]){
//if (argc != 5)
{
printf("\tThis algorithm require 3 parameters"
"\n\t\t1:the size of eage"
"\n\t\t2:the filename contain eage-data"
"\n\t\t3:the size of vertax"
"\n\t\t4:the filename contain vertax-data\n");
//exit(0);
}
//eage_size = atoi(argv[1]);
//strcat(filename_eage, argv[2]);
//vertax_size = atoi(argv[3]);
//strcat(filename_vertax, argv[4]);
wishchin::eage_size = 22;//边的个数
//strcat(filename_eage, argv[2]);
std::string filename_eages("D:/DataSet/RsData/loopFind/houseAdj.txt");
wishchin::vertax_size = 17;//顶点个数
//strcat(filename_vertax, argv[4]);
std::string filename_vertaxs("D:/DataSet/RsData/loopFind/houseVotex.txt");
//printf("eage_size : %d, vertax_size : %d, filename-eage : %s, filename-vertax : %s\n",\
wishchin::eage_size, wishchin::vertax_size, filename_eages, wishchin::filename_vertax);
wishchin::readEageDataFromFile(filename_eages);
wishchin::readVertaxDataFromFile(filename_vertaxs);
wishchin::createAdjacentMatrix();
wishchin::DFSTraverse();
//test_stack();
return true;
}
namespace wishchin{
void readEageDataFromFile( std::string filename_eages)
{
FILE* f_read;
if (NULL == (f_read = fopen(filename_eages.c_str(),