旅行商问题

ce1b27633255485e8fe527195b08e9e9.jpg

 

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define FINITY 1000
int thingnum; //节点数
int bian;//边个数
int a[MAXSIZE][MAXSIZE];//邻接矩阵
int x[MAXSIZE]={0,3,2,5,1,4};


int cc=0;
int bestc=FINITY;
int bestx[MAXSIZE];
//输出邻接矩阵
void outputjuzhen()
{
    int i,j;
    for(i=1;i<=thingnum;i++)
    {
        for(j=1;j<=thingnum;j++)
        {
            printf("%-5d",a[i][j]);
        }
        printf("\n");
    }
}
//交换
void swap(int t,int i)
{
    int temp;
    temp = x[t];
    x[t] = x[i];
    x[i] = temp;
}

void bactrack(int i)
{
    int j,k;
    if(i==thingnum)
    {
        if(a[x[thingnum-1]][x[thingnum]]!=FINITY && a[x[thingnum]][x[1]]!=FINITY && (cc+a[x[thingnum-1]][x[thingnum]]+a[x[thingnum]][x[1]] < bestc || bestc ==FINITY))
        {
            for(j=1;j<=thingnum;j++)
            {
                bestx[j] = x[j];
            }
            bestc = cc+a[x[thingnum-1]][x[thingnum]]+a[x[thingnum]][x[1]];

        }
    }
    else
    {
        for(int j=i;j<=thingnum;j++)
        {
            if(a[x[i-1]][x[j]]!=FINITY && (cc+a[x[i-1]][x[j]]<bestc || bestc ==FINITY))
            {
                swap(i,j);
                cc = cc+a[x[i-1]][x[i]];
                //printf("\ncc加后=%d",cc);
                bactrack(i+1);
                cc-=a[x[i-1]][x[i]];
                swap(i,j);
            }

        }

    }
}
//a邻接矩阵从i=1 j=1开始算
int main()
{
    int i,j,k;
    int one,two,num;
    printf("请输入结点个数:");
    scanf("%d",&thingnum);
    printf("请输入边数:");
    scanf("%d",&bian);
    //初始化邻接矩阵和x和bestx数组
    for(i=0;i<=thingnum;i++)
    {
        for(j=0;j<=thingnum;j++)
        {
            a[i][j]=FINITY;
        }
        //x[i]=i;bestx[i]=i;
    }
    printf("请输入边信息:\n");
    for(k=0;k<bian;k++)
    {
        scanf(" %d %d %d",&one,&two,&num);
        a[one][two] = num;
        a[two][one] = num;
    }
    printf("矩阵如下:\n");
    outputjuzhen();
    printf("\nx数组是如下:");
    for(i=0;i<=thingnum;i++)
    {
        printf("%-5d",x[i]);
    }

    bactrack(2);

    printf("\nbestx[MAXSIZE]:");
    for(i=1;i<=thingnum;i++)
    {
        printf("%-5d",bestx[i]);
    }
    printf("%-5d",bestx[1]);
    printf("\nbestc:%d",bestc);
}

/*
5 8
1 2 18
1 3 10
3 4 20
4 5 12
2 5 15
1 4 28
3 2 14
2 4 16
结果为75
*/

/*
5 9
1 2 7
1 3 6
1 4 3
2 3 3
2 4 7
2 5 8
3 4 12
3 5 11
4 5 11
结果31
*/

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值