回溯法-类型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);
     
    }
   
}

 

posted @ 2015-09-30 16:54  hitz&x  阅读(257)  评论(0编辑  收藏  举报