旅行销售人算法

时间:2017-06-02 19:37:32

标签: data-structures

有人可以帮我解决旅行销售人员的代码:

此处的代码:http://www.pracspedia.com/AOA/tsp.html

#include<stdio.h>
#include<conio.h>
int a[10][10],visited[10],n,cost=0;

void get()
{
    int i,j;
    printf("Enter No. of Cities: ");
    scanf("%d",&n);
    printf("\nEnter Cost Matrix\n");
    for(i=0;i < n;i++)
    {
        printf("\nEnter Elements of Row # : %d\n",i+1);
        for( j=0;j < n;j++)
            scanf("%d",&a[i][j]);
        visited[i]=0;
    }
    printf("\n\nThe cost list is:\n\n");
    for( i=0;i < n;i++)
    {
        printf("\n\n");
        for(j=0;j < n;j++)
            printf("\t%d",a[i][j]);
    }
}

void mincost(int city)
{
    int i,ncity;
    visited[city]=1;    
    printf("%d -->",city+1);
    ncity=least(city);
    if(ncity==999)
    {
        ncity=0;
        printf("%d",ncity+1);
        cost+=a[city][ncity];
        return;
    }
    mincost(ncity);
}

int least(int c)
{
    int i,nc=999;
    int min=999,kmin;
    for(i=0;i < n;i++)
    {
        if((a[c][i]!=0)&&(visited[i]==0))
            if(a[i][c]+a[c][i] < min)
            {
                min=a[i][0]+a[c][i];
                kmin=a[c][i];
                nc=i;
            }
    }
    if(min!=999)
        cost+=kmin;
    return nc;
}

void put()
{
    printf("\n\nMinimum cost:");
    printf("%d",cost);
}

void main()
{
    clrscr();
    get();
    printf("\n\nThe Path is:\n\n");
    mincost(0);
    put();
    getch();
}

矩阵:

 0 10 15 20
 5 0  9  10
 6 13 0 12
 8 8  9  0

结果应为cost : 35 但它提供了错误的cost : 39和错误的路径,

有人可以修改代码吗?或提供最简单(代码较少)的程序

  1. 显示费用
  2. 还显示路径?
  3. 请帮忙。我测试了很多程序,但没有一个能给出正确答案。

1 个答案:

答案 0 :(得分:-1)

从你可以阅读的source-code site

  

代码中的变化很小。行min = a [i] [0] + a [c] [i];   应该是min = a [i] [c] + a [c] [i];

以下是您要更改的功能:

int least(int c)
{
    int i,nc=999;
    int min=999,kmin;
    for(i=0;i < n;i++)
    {
        if((a[c][i]!=0)&&(visited[i]==0))
            if(a[c][i] < min)
            {
                min=a[i][c]+a[c][i];
                kmin=a[c][i];
                nc=i;
            }
    }
    if(min!=999)
        cost+=kmin;
    return nc;
}