tsp问题

   旅行商问题(tsp问题)就是一个经销商从n个城市中的某一城市出发,不重复的走完其余的n-1个城市并回原出发点,求所有可能路径单中走出路径长度最短的一条。

 本题假设旅行商从第一个城市出发。

  解法:dfs+回溯

#include <iostream>

using namespace std;

#define NUM 100

int n;//图G的顶点数
int m;//图G的边数
int a[NUM][NUM];//图G的邻接矩阵
int x[NUM] = {0}; //当前解
int bestx[NUM];//最优解
int cc = 0; //当前费用
int bestc = 0; //当前最优值
int NoEdge = -1; //无边标记
int Visited[100];//访问标志
int num = 0;

int FirstArc(int t)
{
    for(int i = 1; i <= m; i++)
        if(a[t][i] != NoEdge)
            return i;
    return 0;
}

int NextArc(int t, int w)
{
    for(int p = w + 1; p <= m; p++)
        if(a[t][p] != NoEdge)
            return p;
    return 0;
}

void dfs(int t)
{
    int l, i;
    Visited[t] = 1;

    if(num == m && a[t][1] != NoEdge)
    {
        if(cc + a[t][1] < bestc)
        {
            bestc = cc + a[t][1];
            for(int s = 0; s < m; s++)
                bestx[s] = x[s];
        }
    }
    else
    {
        for(i = FirstArc(t); i != 0; i = NextArc(t, i))
            if(!Visited[i] && a[t][i] != NoEdge)
                if(cc + a[t][i] < bestc) //剪枝
                {
                    x[num++] = i;
                    cc += a[t][i];
                    dfs(i);
                    cc -= a[t][i];
                    Visited[i] = 0;
                    num--;
                }
    }
}

void tsp(int t)
{
    for(int i = 1; i <= m; i++)
        Visited[i] = 0;

    //保存第一个节点
    x[num++] = t;
    Visited[t] = 1;

    for(int q = FirstArc(t); q != 0; q = NextArc(t, q))
        if(a[t][q] != NoEdge && !Visited[q])
        {
            x[num++] = q;
            cc += a[t][q];
            dfs(q);
            cc -= a[t][q]; //回溯
            Visited[q] = 0;
            num--;
        }
}


int main()
{
    int s, e, t;
    scanf("%d%d", &m, &n);
    //初始化邻接矩阵
    for(int i = 1; i <= m; i++)
        for(int j = 1; j <= m; j++)
            a[i][j] = NoEdge;    //表示两个节点不相连

    for(int i = 1; i <= n; i++)
    {
        scanf("%d%d%d", &s, &e, &t);
        a[s][e] = t;
        a[e][s] = t;
    }
    //初始化变量
    bestc = 1000;
    tsp(1);

    for(int i = 0; i < m; i++)
        printf("%d ", bestx[i]);

    printf("\nbestc=%d\n", bestc);
    return 0;
}

/*
1 2 20
1 4 4
1 3 6
2 3 5
2 4 10
3 4 15

*/




posted @ 2015-10-11 20:10  gaot  阅读(591)  评论(0编辑  收藏  举报