}
CTime::CTime(int h, int m)
{
mm = m;
hh = h;
while(mm>=60) {mm-=60; ++hh;}
while(mm<0) {mm+=60;--hh;}
}
CTime::CTime(CTime& time)
{
hh = time.hh;
mm = time.mm;
}
CTime& CTime::operator = (CTime& time)
{
hh = time.hh;
mm = time.mm;
return *this;
}
CTime CTime::operator + (CTime& time)
{
CTime result;
result.mm = mm+time.mm;
result.hh = hh+time.hh;
while(result.mm>=60) {result.mm-=60; ++result.hh;}
while(result.mm<0) {result.mm+=60; --result.hh;}
return result;
}
CTime CTime::operator - (CTime& time)
{
CTime ttime(-time.hh, -time.mm), result=*this+ttime;
return result;
}
char CTime::operator == (CTime& time)
{
if (hh==time.hh && mm==time.mm) return 1;
return 0;
}
char CTime::operator > (CTime& time)
{
if (hh>time.hh || hh==time.hh && mm>time.mm) return 1;
return 0;
}
char CTime::operator < (CTime& time)
{
if (hh<time.hh || hh==time.hh && mm<time.mm) return 1;
return 0;
}
void CTime::set(int h, int m)
{
hh = h;
mm = m;
while(mm>=60) {mm-=60; ++hh;}
while(mm<0) {mm+=60;--hh;}
}
char CTime::null()
{
if (hh==0 && mm==0) return 1;
return 0;
}
#include "cbase.h"
CBase::CBase(char *file_name)
{
FILE *f;
char city[255];
int i, time;
f = fopen(file_name, "r+t");
// Ввод кол-ва городов
fscanf(f, "%u", &num_city);
// Ввод названий городов
city_name = new CString[num_city];
for (i=0; i<num_city; ++i)
{
fscanf(f, "%s", city);
city_name[i] = city;
}
// Ввод координат городов
city_coor = new int[num_city*2];
for (i=0; i<2*num_city; ++i)
fscanf(f, "%d", &city_coor[i]);
// Ввод матрицы времени пути
path_time = new CTime[num_city*num_city];
for (i=0; i<num_city*num_city; ++i)
{
fscanf(f, "%d", &time);
path_time[i].set(0, time);
}
// Ввод матрицы отправлений
depar_time = new CTime[num_city*num_city];
for (i=0; i<num_city*num_city; ++i)
{
fscanf(f, "%d", &time);
depar_time[i].set(0, time);
}
fclose(f);
// Выделение памяти для вспомогательных переменных
visited = new char[num_city];
cur_path = new char[num_city];
best_path = new char[num_city];
}
CBase::~CBase()
{
// Удаление вспомогательных переменных
delete [] visited;
delete [] cur_path;
delete [] best_path;
// Удаление основных данных
delete [] city_name;
delete [] city_coor;
delete [] path_time;
delete [] depar_time;
}
CString CBase::search_path(CString& city_from, CString& city_to)
{
CString result;
CTime time;
int i;
num_from = -1; num_to = -1;
len_best_path = 0;
// Получение номеров городов
for (i=0; i<num_city; ++i)
{
if (city_name[i]==city_from) num_from = i;
if (city_name[i]==city_to) num_to = i;
}
// Проверка введенных данных
if (num_from==-1 || num_to==-1)
{
result = city_from+"-"+city_to+" отсутствует маршрут...\n";
return result;
}
if (num_from==num_to)
{
result = "Станции отправления и назначения совпадают...";
return result;
}
// Инициализация структур алгоритма
for (i=0; i<num_city; ++i)
{
visited[i] = 0;
cur_path[i] = 0;
best_path[i] = 0;
}
best_time.set(32767, 0);
depth = -1;
// Главная функция
dfs(num_from, time);
// Обработка результатов
if (best_time.hour()==32767)
result = city_name[num_from]+"-"+city_name[num_to]+" отсутствует маршрут...";
else
{
i=0;
result = "";
while (best_path[i]!=num_to)
{
result = result+city_name[best_path[i]]+" ";
++i;
}
result = result+city_name[num_to];
len_best_path = i+1;
}
return result;
}
void CBase::dfs(int v, CTime time0)
{
CTime wait, time;
int h, m;
int i;
// Отмечаем вершину как пройденную
visited[v] = 1;
// Добавляем в путь
cur_path[++depth] = v;
// Если приехали - проверяем оптимальность
if (v==num_to && time0<best_time)
{
for (i=0; i<depth+1; ++i) best_path[i] = cur_path[i];
best_time = time0;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.