最小长度电路板排列问题 5_2 6_1 2011-05-2017:26:14 计算机算法设计与分析5_2 回溯法: //Author:王子硕 Date:2011/5/11 //Description:最小长度电路板排列问题 //该问题用回溯法求解,一颗排列树。最坏情况下有n!个节点.对于剪枝函数caNowl复杂度为o(mn)。n为电路板数量,m为连接块数量. //所以此问题的总复杂度为O(mn*n!) #include <iostream> #include <fstream> using namespace std; class minBoard{ public: minBoard(int n, int m, int *B); int* getBestx(){return bestx;} int getMinl(){return minl;} private: int minl;//最优最大长度 int nowl;//当前最大长度 int *low;//low[i]表示第i块连接块中最左边的电路板的下标 int *high;//high[i]表示第i快连接块中最右边的电路板的下标 int *x;//当前解向量 int *bestx;//当前最优解向量 int *B;//B[i][j] = 1表示第i个电路板在第j个连接块中 int n;//电路板数量 int m;//连接块数量 int t;//递归深度 void Backtrack(int t);//回溯递归函数 int caNowl(int t);//计算当前排列的最大长度 }; minBoard::minBoard(int n, int m, int *B){ this->B = B; this->n = n; this->m = m; this->t = 1; minl = 0x7fffffff; nowl = 0; x = new int[n + 1]; bestx = new int[n + 1]; for (int i = 1; i <= n; ++i) { x[i] = i; } low = new int[m + 1]; high = new int[m + 1]; this->Backtrack(t); } int minBoard::caNowl(int t){ for (int i = 1; i <= m; ++i){ low[i] = n + 1; high[i] = 0; } for (i = 1; i <= t; ++i) { for (int j = 1; j <= m; ++j) { if (B[(m + 1) * x[i] + j]) { if (low[j] > i)low[j] = i; if (high[j]