所以我认为我在正确的轨道上使用分支定界方法来解决我对旅行问题的启发式解决方案,但是,我的“最小”功能出现分段错误,但我仍然很难理解围绕算法。任何解决此问题的帮助将不胜感激。基本上该功能的要求(因为我的主要功能看起来很有趣)是程序应该占用多达 150 个城市,如果它在 60 秒内读取,我会得到奖励积分(这意味着我不会失败)输入文件会看起来like(例如): c 1 c 2 a 1 2 300 其中“c”表示“创建城市”,“a”表示“添加边界”。这就是为什么我的程序是这样设置的。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cost=0;
int main(){
int numcity ,a[151][151],visited[151],worthless,city1,city2,distance;
char citystring[2];
a[1][1]=0;
while(scanf("%s",citystring) != EOF){
if(strcmp(citystring, "c") == 0){
scanf("%d", &worthless);
numcity++;
}
else if(strcmp(citystring, "a") == 0){
scanf("%d %d %d",&city1,&city2,&distance);
a[city1][city2] = distance;
a[city2][city1] = distance;
}
}
mincost(1,numcity,a,visited);
printf("The minimum cost tour is %d",cost);
return 0;
}
int mincost(int city,int n,int a[151][151],int visited[151]){
int i,ncity;
visited[city]=1;
printf("%d->",city);
ncity=least(city,n,a,visited);
if(ncity==999999){
ncity=1;
printf("%d",ncity);
cost+=a[city][ncity];
}
mincost(ncity,n,a,visited);
}
int least(int c,int n,int a[151][151],int visited[10]){
int i,nc=999999,min=999999,kmin;
for(i=1;i<=n;i++){
if((a[c][i]!=0)&&(visited[i]==0)){
if(a[c][i]<min){
min=a[i][1]+a[c][i];
kmin=a[c][i];
nc=i;
}
}
}
if(min!=999999)
cost+=kmin;
return nc;
}