《算法设计与分析》实验报告

}

}

cin>>distance[i][j];

//生成过程矩阵

process=new int*[city_number]; for(i=0;i

process[i]=new int[1<<(city_number-1)];

//动态规划法求最短路径

void Tsp::getShoretstDistance() {

//对于数字x,要看它的第i位是不是1,通过判断布尔表达式 (((x >>

int i,j,k; //初始化第一列

for(i=0;i

//初始化剩余列

for(j=1;j<(1<<(city_number-1));j++) {

for(i=0;i

process[i][j]=0x7ffff;//设0x7ffff为无穷大 process[i][0]=distance[i][0];

(i - 1) ) & 1) == 1的真值来实现

if(((j>>(i-1))&1)==1) {

6

}

continue;

for(k=1;k

//不能达到k城市 if(((j>>(k-1))&1)==0) { }

if(process[i][j]>distance[i][k]+process[k][j ^ (1 << (k -

continue;

1))])

{

process[i][j]=distance[i][k]+process[k][j ^ (1 << (k -

1))]; } //主函数 int main(void) {

int city_number; while(cin>>city_number) {

//初始化城市代价矩阵

//求出最短路径

}

cout<

}

}

}

Tsp tsp(city_number);

tsp.getShoretstDistance(); }

7

}

return 0;

3、 回溯法

#define MAX 100 using namespace std;

int n; //城市个数 int a[MAX][MAX]; //城市间距离 int x[MAX]; //记录路径 int bestx[MAX] = {0}; //记录最优路径 int bestp = 63355; //最短路径长 int cp = 0; //当前路径长 void backpack(int t){ if(t>n){

if((a[x[n]][1])&&(a[x[n]][1]+cp

for(int i = t;i<=n;i++){

/*约束为当前节点到下一节点的长度不为0,限界为走过的长度+当前要走的长度之和小于最优长度*/

if((a[x[t-1]][x[i]])&&(cp+a[x[t-1]][x[i]]

8

} } }

int main(){

cin>>n; //顶点数 for(int i = 1;i<=n;i++){ x[i] = i; }

for(int i = 1;i<=n;i++){ for(int j = 1;j<=n;j++){

} }

backpack(2); cout<

if(i==j){

a[i][j]=0;

}else{ }

cin>>a[i][j];

4、 分支限界法

#define INF 0x3f3f3f3f int n;

int mp[100][100];

void in() {

scanf(\

9

for(int i=1; i<=n; i++) {

for(int j=1; j<=n; j++) {

if(i==j) {

mp[i][j]=INF; continue; }

scanf(\ } } }

struct node {

int visp[22];//标记哪些点走了 int st;//起点

int st_p;//起点的邻接点 int ed;//终点

int ed_p;//终点的邻接点 int k;//走过的点数 int sumv;//经过路径的距离 int lb;//目标函数的值

bool operator <(const node &p )const {

return lb>p.lb; } };

priority_queue q; int low,up;

10

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4