回溯法-类型2-排列树
最短路径问题
递归方法求解
#include<stdio.h>
#define N 4
#define NO_PATH -1
#define MAX_WEIGHT 4000
int City_Graph[N+1][N+1];
int x[N+1];
int isIn[N+1];
int bestw;
int cw;
int bestx[N+1];
void travel_back(int t)
{
int i,j;
if(t>N)
{
for(i=1;i<=N;i++)
{
printf("%d ",x[i]);
}
printf("\n");
if(cw<bestw)
{
for(i=1;i<=N;i++)
{
bestx[i]=x[i];
}
bestw=cw;
}
}
else
{
for(j=1;j<=N;j++)
{
if((isIn[j]!=1)&&(City_Graph[x[t-1]][j]!=NO_PATH))
{
cw+=City_Graph[x[t-1]][j];
x[t]=j;
isIn[j]=1;
travel_back(t+1);
cw-=City_Graph[x[t-1]][j];
x[t]=0;
isIn[j]=0;
}
}
}
}
int main()
{
int i;
City_Graph[1][1] = NO_PATH;
City_Graph[1][2] = 30;
City_Graph[1][3] = 6;
City_Graph[1][4] = 4;
City_Graph[2][1] = 30;
City_Graph[2][2] = NO_PATH;
City_Graph[2][3] = 5;
City_Graph[2][4] = 10;
City_Graph[3][1] = 6;
City_Graph[3][2] = 5;
City_Graph[3][3] = NO_PATH;
City_Graph[3][4] = 20;
City_Graph[4][1] = 4;
City_Graph[4][2] = 10;
City_Graph[4][3] = 20;
City_Graph[4][4] = NO_PATH;
for(i=1;i<=N;i++)
{
x[i]=0;
isIn[i]=0;
bestx[i]=0;
}
x[1]=1;
isIn[1]=1;
bestw=4000;
cw=0;
travel_back(2);
printf("最优值为%d\n",bestw);
printf("最优解为:\n");
for(i=1;i<=N;i++){
printf("%d ",bestx[i]);
}
printf("\n");
}
全排列算法JAVA版
public class Queen8 {
private static int n = 5;
private static int [] x = new int [n+1];
private int [] isIn = new int [n+1];
public void get(int t)
{
if(t>=n)
{
for(int i=1;i<=n;i++)
{
System.out.print(x[i]);
}
System.out.println();
}
else
{
for(int j=1;j<=n;j++)
{
if(isIn[j]==0)
{
x[t+1]=j;
isIn[j]=1;
get(t+1);
x[t+1]=0; //注意这个返回过程,不用放在外面,因为只有get(t+1)以后失败才会返回上个节点
isIn[j]=0;
}
}
}
}
public static void main(String args[]){
Queen8 q = new Queen8();
q.get(0);
}
}