}
//очистка таблицы
void pust (table *T)
{
int i;
for (i=0; i<N; i++){
T->elem[i].numb=0;
T->elem[i].name[0]='\0';
}
T->n=0;
}
//очистка матрицы весов
void pustm (int **mat, int n)
{
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
mat[i][j]=0;
}
//добавление в таблицу
int addtable (table *t, city *elem)
{
int i,k=0, g=1, max=0;
for (i=0; i<t->n; i++){
if (!strcmp(t->elem[i].name , elem->name))
{
elem->numb=t->elem[i].numb;
g=0;
}
if (t->elem[i].numb>=max)
max=t->elem[i].numb+1;
}
if (g) elem->numb=max;
strcpy(t->elem[t->n].name,elem->name);
t->elem[t->n].numb=elem->numb;
t->n++;
return max;
}
//поиск города но номеру в таблице
void findtf (table *t, int numb, char *name)
{
int i, stop=1;
for (i=0; i<t->n&&stop!=0; i++)
if(t->elem[i].numb==numb)
{
strcpy(name, t->elem[i].name);
stop=0;
}
}
//ввод сети дорог
int getweb (FILE *in, table *T, int **wm1t)
{
char e;
int i=0,j,k, g;
city town;
fscanf (in, "%c", &e);
while (e!=':')
{
j=0;
while (e!=' '&&e!=':')
{
town.name[j]=e;
j++;
fscanf (in, "%c", &e);
}
town.name[j]='\0';
k=addtable(T,&town);
i++;
fscanf (in, "%c", &e);
}
int a=0;
if (e==':')
for (i=0; i<=k+1; i++)
{
fscanf (in, "%d", &wm1t[T->elem[a].numb][T->elem[a+1].numb]);
a=a+2;
}
return k;
}
//поиск максимального по длине пути
void find (table *t, int kol, int **matr, int start, int end, FILE *out)
{
int *mark;
int i,j,y,weight,k=0,a;
long *dest, *prev;
char name [21];
mark = (int *)malloc(N*sizeof(int));
dest = (long *)malloc(N*sizeof(long));
prev = (long *)malloc (N*sizeof(long));
for (i=0; i<=kol; i++)
{mark[i]=0;
dest[i]=0;
}
y=start;
mark[y]=1;
dest[y]=0;
a=kol-1;
while (!mark[end])
{
for (i=0; i<a; i++)
if ((!mark[i])&&(dest[i]<dest[y]+matr[y][i]))
{
dest[i]=dest[y]+matr[y][i];
prev[i]=y;
}
weight=0;
for (i=0; i<a-1; i++)
if (!mark[i])
if (weight<dest[i])
{
weight=dest[i];
y=i;
}
mark[y]=1;
a++;
}
i=end;
while (i!=start)
{
findtf(t,i,name);
fprintf (out, "%s ", name);
i=prev[i];
}
findtf(t,i,name);
fprintf (out, "%s", name);
fprintf (out, "\nДлинна=%d", dest[end]);}
6.2. Модуль 2
#include "func.h"
void main ()
{
setlocale(LC_ALL,"");
FILE *in, *out;
in=fopen("input.txt","r");
table t;
int **wm1t, kol, dest=-1, start=-1;
wm1t=(int **)malloc (N*sizeof(int));
for (int i=0; i<N; i++)
wm1t[i]=(int *)malloc (N*sizeof(int));
pustm(wm1t,N);
pust(&t);
kol=getweb(in,&t,wm1t);
fclose(in);
out=fopen("output.txt","w");
menu(&t,&dest,&start);
if (start==-1||dest==-1)
printf ("Нет такого города в сети дорог!!!");
else
find(&t,kol,wm1t,dest,start,out);
fclose (out);
printf ("\n");
system ("pause");
}
7. Тесты
№ |
Сеть дорог |
Города |
Длина пути |
1 |
Ald 8 Nsk |
Ald, Nsk |
8 |
2 |
7 Kaz Ald 8 Nsk 10 |
Nsk, Kaz |
15 |
3 |
Ald 8 5 Nsk 10 Ny 12 Bst 7 |
Nsk, Ny |
20 |
4 |
Ald 10 Kaz 8 5 15 Nsk 10 Ny 12 Bst 7 |
Nsk, Kaz |
27 |
8. Результат отладки и анализ программ
Программа работает правильно, что подтверждается результатами тестов.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.