日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

无向图:查找最小环集合(最短路径回溯算法)

發(fā)布時(shí)間:2023/12/31 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无向图:查找最小环集合(最短路径回溯算法) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

???????? 在無(wú)向圖中查找最小環(huán),就像需要查找一個(gè)蜂窩中所有孔洞,如果只查找數(shù)目,可以利用歐拉公式,若查找到所有環(huán),需要更進(jìn)一步的搜索。

???????? 方法:尋找到所有頂點(diǎn)的最短路徑,對(duì)每一個(gè)頂點(diǎn),取出環(huán),循環(huán)刪除頂點(diǎn),輸出所有最小環(huán)。

???????? 注意:拓?fù)鋱D具有位置可變性,不影響圖結(jié)構(gòu)的拓?fù)渥兓K源朔椒?#xff0c;只能找到拓?fù)渥钚…h(huán),若想找到距離最小環(huán),需要對(duì)邊進(jìn)行加權(quán)。

??????? ?


??????? 原文:找出無(wú)向圖中所有環(huán)的算法。代碼也轉(zhuǎn)自于作者。

???????

圖片實(shí)例:

??? ??

code:

???????

bool findAllLoop(int argc, char* argv[]);//查找所有路徑的算法是成功的;但最短路徑不能保證找到最小環(huán) 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;//邊的個(gè)數(shù)//strcat(filename_eage, argv[2]);std::string filename_eages("D:/DataSet/RsData/loopFind/houseAdj.txt");wishchin::vertax_size = 17;//頂點(diǎn)個(gè)數(shù)//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(), "r"))){printf("open file(%s) error!\n", filename_eages.c_str());exit(0);}//create dynamic array for storing original data form file @filename eage_set = (int**)malloc(sizeof(int*) * (eage_size + 1));if (!eage_set){printf("malloc error: eage_set**\n");exit(0);}int i;for (i = 1; i <= eage_size; i++){eage_set[i] = (int*)malloc(sizeof(int) * (2 + 1));if (!eage_set[i]){printf("eage_set[%d] malloc error", i);exit(0);}}//read original data from file //直接讀入邊的集合for (i = 1; i <= eage_size; i++){if (2 != fscanf(f_read, "%d %d", &eage_set[i][1], &eage_set[i][2])){printf("fscanf error: %d\n", i);exit(0);}printf("%d\t%d\n", eage_set[i][1], eage_set[i][2]);}//test printf("\n show the origin data from file\n");for (i = 1; i <= eage_size; i++){printf("%d\t%d\n", eage_set[i][1], eage_set[i][2]);}printf("\n");//test END }void readEageDataFromFile(){FILE* f_read;if (NULL == (f_read = fopen(filename_eage, "r"))){printf("open file(%s) error!\n", filename_eage);exit(0);}//create dynamic array for storing original data form file @filename eage_set = (int**)malloc(sizeof(int*) * (eage_size + 1));if (!eage_set){printf("malloc error: eage_set**\n");exit(0);}int i;for (i = 1; i <= eage_size; i++){eage_set[i] = (int*)malloc(sizeof(int) * (2 + 1));if (!eage_set[i]){printf("eage_set[%d] malloc error", i);exit(0);}}//read original data from file //直接讀入邊的集合for (i = 1; i <= eage_size; i++){if (2 != fscanf(f_read, "%d %d", &eage_set[i][1], &eage_set[i][2])){printf("fscanf error: %d\n", i);exit(0);}}//test printf("\n show the origin data from file\n");for (i = 1; i <= eage_size; i++){printf("%d\t%d\n", eage_set[i][1], eage_set[i][2]);}printf("\n");//test END }void readVertaxDataFromFile(){//create the dynamic array for saving vertax-set information vertax_set = (char**)malloc(sizeof(char*) * (vertax_size + 1));if (!vertax_set){printf("vertax_set malloc error");exit(0);}int i;for (i = 1; i <= vertax_size; i++){vertax_set[i] = (char*)malloc(sizeof(char) * (20 + 1));if (!vertax_set[i]){printf("vertax_set[%d] malloc error");exit(0);}}//open file FILE* f_read;if (NULL == (f_read = fopen(filename_vertax, "r"))){printf("open file(%s) error", filename_vertax);exit(0);}//read vertax-set information for (i = 1; i <= vertax_size; i++){if (1 != fscanf(f_read, "%s ", vertax_set[i])){printf("fscanf vertax_set[%d] error", i);exit(0);}}//test for (i = 1; i <= vertax_size; i++){printf("%s\n", vertax_set[i]);}printf("\n");//test END }void readVertaxDataFromFile( std::string filename_vertaxs ){//create the dynamic array for saving vertax-set information vertax_set = (char**)malloc(sizeof(char*) * (vertax_size + 1));if (!vertax_set){printf("vertax_set malloc error");exit(0);}int i;for (i = 1; i <= vertax_size; i++){vertax_set[i] = (char*)malloc(sizeof(char) * (20 + 1));if (!vertax_set[i]){printf("vertax_set[%d] malloc error");exit(0);}}//open file FILE* f_read;if (NULL == (f_read = fopen(filename_vertaxs.c_str(), "r"))){printf("open file(%s) error", filename_vertaxs.c_str());exit(0);}//read vertax-set information for (i = 1; i <= vertax_size; i++){if (1 != fscanf(f_read, "%s ", vertax_set[i])){printf("fscanf vertax_set[%d] error", i);exit(0);}}//test for (i = 1; i <= vertax_size; i++){printf("%s\n", vertax_set[i]);}printf("\n");//test END }void createAdjacentMatrix(){//create the dynamic array for saving adjcaent matrix adjacentMatrix = (int**)malloc(sizeof(int*) * (vertax_size + 1));if (!adjacentMatrix){printf("adjacentMatrix** malloc error");exit(0);}int i;for (i = 1; i <= vertax_size; i++){adjacentMatrix[i] = (int*)malloc(sizeof(int) * (vertax_size + 1));if (!adjacentMatrix[i]){printf("adjacentMatrix[%d] malloc error");exit(0);}}//initial the value of adjacentMatrix int j;for (i = 1; i <= vertax_size; i++){for (j = 1; j <= vertax_size; j++){adjacentMatrix[i][j] = 0;}}//set the value for adjacentMatrix for (i = 1; i <= eage_size; i++){adjacentMatrix[eage_set[i][1]][eage_set[i][2]] = 1;adjacentMatrix[eage_set[i][2]][eage_set[i][1]] = 1;}//test printf("\n show the information about adjacent matrix: \n");for (i = 1; i <= vertax_size; i++){for (j = 1; j <= vertax_size; j++){printf("%d ", adjacentMatrix[i][j]);}printf("\n");}//test END } }namespace wishchin{int loop_count;int heap;int innerStep = 0;int temp;int isRecall;SequenceStack loop_stack;int pop_value;void DFS(int startVertax){setVisitedFlag(startVertax, 1);int nextVertax;push_stack(&loop_stack, startVertax);nextVertax = firstAdjacentVertax(startVertax);innerStep++;for (;;){if (nextVertax != -1){if (visitedFlag[nextVertax] == 1 && nextVertax == heap && innerStep == 2){nextVertax = nextAdjacentVertax(startVertax, nextVertax);continue;}else if (visitedFlag[nextVertax] == 1 && nextVertax == heap && innerStep != 2){print_stack(loop_stack);nextVertax = nextAdjacentVertax(startVertax, nextVertax);continue;}else if (visitedFlag[nextVertax] == 0){DFS(nextVertax);}if (isRecall == 1){innerStep--;temp = nextVertax;nextVertax = nextAdjacentVertax(startVertax, nextVertax);pop_stack(&loop_stack, &pop_value);setVisitedFlag(temp, 0);isRecall = 0;continue;}nextVertax = nextAdjacentVertax(startVertax, nextVertax);}else if (nextVertax == -1){isRecall = 1;break;}}}void DFSTraverse(){initialVisitedFlagArray();initializeSequenceStack(&loop_stack);int i;for (heap = 1; heap <= vertax_size; heap++){for (i = 1; i <= vertax_size; i++){visitedFlag[i] = 0;}/*printf("print the visitedFlag array: ");for( i = 1; i <= vertax_size; i++ ){printf("%d ", visitedFlag[i]);}printf("\n");*/if (visitedFlag[heap] == 0){printf("\n-------------------the loop start and end with %d----------------\n", heap);clear_stack(&loop_stack);innerStep = 0;//printf("isRecall : %d, findLoop : %d, hasOthers : %d\n", isRecall, findLoop, hasOthers); isRecall = 0;DFS(heap);}}}void initialVisitedFlagArray(){visitedFlag = (int*)malloc(sizeof(int) * (vertax_size + 1));if (!visitedFlag){printf("visitedFlag* malloc error");exit(0);}int i;for (i = 1; i <= vertax_size; i++)visitedFlag[i] = 0;}void printVisitedVertax(int vertaxID){printf("visited: %d \n", vertaxID);}void setVisitedFlag(int vertaxID, int value){visitedFlag[vertaxID] = value;}int firstAdjacentVertax(int vertaxID){int i;for (i = 1; i <= vertax_size; i++){if (adjacentMatrix[vertaxID][i] == 1)return i;}return -1;}int nextAdjacentVertax(int vertaxID, int nextVertaxID){int i;for (i = nextVertaxID + 1; i <= vertax_size; i++){if (adjacentMatrix[vertaxID][i] == 1)return i;}return -1;}void initializeSequenceStack(SequenceStack* stack){stack->base = (int*)malloc(sizeof(int) * (vertax_size + 1));if (!stack->base){printf("Sequence stack malloc error!\n");exit(0);}stack->top = stack->base;stack->stackSize = vertax_size;}void pop_stack(SequenceStack* stack, int* value){if (empty_stack(*stack) == 1){printf("stack is empty , can not to pop!\n");exit(0);}*value = *(--(stack->top));}void push_stack(SequenceStack* stack, int value){*(stack->top) = value;(stack->top)++;}int empty_stack(SequenceStack stack){return stack.top == stack.base ? 1 : 0;}void print_stack(SequenceStack stack){int temp = *(stack.base);while (stack.top != stack.base){printf("%d->", *((stack.base)++));}printf("%d\n", temp);}void clear_stack(SequenceStack* stack){stack->top = stack->base;} }
測(cè)試數(shù)據(jù):

????? houseAdj.txt:

1 2
2 3
3 4
1 5
2 6
3 7
4 8
5 6
5 9
7 8
7 12
9 10
10 11
11 12
12 17
9 13
10 14
11 15
17 16
13 14
14 15
15 16


????? housevotex.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17


程序輸出:




???????



總結(jié)

以上是生活随笔為你收集整理的无向图:查找最小环集合(最短路径回溯算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。