C-код для ветвления и связанного выпуска
Так что я думаю, что я на правильном пути, используя метод ветвления и привязки для решения моего эвристического решения задачи о путешествии, однако, я получаю ошибку сегментации в своей "наименьшей" функции, но мне все еще трудно справиться со своей задачей вокруг алгоритма. Любая помощь, исправляющая это, очень ценилась бы. В основном требования к функции (потому что моя основная функция выглядит забавно) состоят в том, что программа должна занимать до 150 городов, и если она читается менее чем за 60 секунд, я получаю бонусные баллы (что означает, что я не ошибаюсь), входной файл будет выглядеть например (например): 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;
}
2 ответа
Массивы C индексируются 0, но ваш индекс идет от 1..n вместо 0..(n-1) ... поэтому вы объявили 151 вместо 150?
Но ваш сбой, вероятно, из-за того, что mincost называет себя безоговорочно. Вы говорите, что думаете, что находитесь на правильном пути, но испытываете затруднения, обдумывая алгоритм... Я думаю, что эти утверждения противоречивы. Вы должны быть уверены, что понимаете алгоритм, прежде чем пытаться его кодировать.
Ядро вашей программы выгружает последнюю строку mincost(), которая является рекурсивным вызовом mincost().
причина сбоя в том, что вы дуете (переполняете) стек.
У вас есть рекурсивный эквивалент бесконечного цикла.
Когда должна быть возвращена минимальная стоимость?