void FindVertexs(int *G, int *weight, int vertex, int num, int len, int path, int *IsVis, int *res, int curV, int start);
#endif /* __FUNCTIONS__ */
Модуль, включающий в себя функции программы:
#include "functions.h"
void ReadGraph(FILE *file, int *num, int **G, int **weight)
{
int count; /* обыкновенный счетчик */
char curStr[STR_SIZE]; /* текущая строка */
fgets(curStr, STR_SIZE, file);
sscanf(curStr, "%d", num);
*G = (int *)calloc((*num)*(*num), sizeof(int));
*weight = (int *)malloc((*num)*(*num)*sizeof(int));
for(count = 0; count < (*num)*(*num); ++count)
{
(*weight)[count] = INT_MAX;
}
while(fgets(curStr, STR_SIZE, file) != NULL)
{
int ver[2]; /* две текущие вершины */
int w; /* вес текущего ребра */
sscanf(curStr, "%d - %d : %d", &ver[0], &ver[1], &w);
(*G)[ver[0]*(*num) + ver[1]] = 1;
(*weight)[ver[0]*(*num) + ver[1]] = w;
}
};
void FindVertexs(int*G, int *weight, int vertex, int num, int len, int path, int *IsVis, int *res, int curV, int start)
{
int cnt;
if(path == len && curV == vertex)
{
res[start] = 1;
}
for(cnt = 0; cnt < num; cnt++)
{
if(G[curV*num + cnt] == 1 && !IsVis[cnt])
{
IsVis[cnt] = 1;
FindVertexs(G, weight, vertex, num, len, path + weight[curV*num + cnt], IsVis, res, cnt, start);
IsVis[cnt] = 0;
}
}
};
Модуль с основной программой(main):
#include <stdlib.h>
#include <stdio.h>
#include "functions.h"
int main(int argc, char **argv)
{
FILE *fin; /* файл откуда читаем граф */
FILE *swe; /* файл куда помещаем результат */
int vertex; /* вершина для которой нужно все сделать */
int length; /* необходимая длина пути */
int num; /* количество вершин в графе */
int *G; /* массив ребер; 1 - есть ребро, 0 - нет ребра */
int *weight; /* веса ребер, если ребра нет то INT_MAX */
int *IsVis; /* массив посещенных вершин */
int *result; /* массив достижимых вершин */
int cnt; /* счетчик */
do
{
if(argc > 4)
{
printf("Too many arguments:\n-[filename] -[vertex] -[length]\n");
break;
}
if(argc < 4)
{
printf("Too few arguments:\n-[filename] -[vertex] -[length]\n");
break;
}
fin = fopen(argv[1], "rb");
if(fin == NULL)
{
printf("Can not open \"%s\"\n", argv[1]);
break;
}
sscanf(argv[2], "%d", &vertex);
sscanf(argv[3], "%d", &length);
ReadGraph(fin, &num, &G, &weight);
IsVis = (int *)calloc(num, sizeof(int));
result = (int *)calloc(num, sizeof(int));
for(cnt = 0; cnt < num; cnt++)
{
if(cnt != vertex)
{
IsVis[cnt] = 1;
FindVertexs(G, weight, vertex, num, length, 0, IsVis, result, cnt, cnt);
IsVis[cnt] = 0;
}
}
swe = fopen("out.txt", "w");
for(cnt = 0; cnt < num; cnt++)
{
if(result[cnt] == 1)
{
fprintf(swe,"%d\n", cnt);
}
}
fclose(fin);
fclose(swe);
free(weight);
free(IsVis);
free(result);
free(G);
} while(0);
return 0;
};
7. Тесты
№ |
Дано в файле |
Входные данные |
Графическое представление |
Выходные данные |
Комментарии |
1 |
5 1 – 2 : 3 2 – 3 : 3 3 – 4 : 3 4 – 5 : 3 5 – 2 : 3 |
In.txt 4 6 |
2 |
Работа программы при нормальных условиях |
|
2 |
5 1 – 2 : -9 2 – 3 : -2 3 – 4 : -7 3 – 5 : 8 5 – 2 : 3 |
In.txt 5 -3 |
1 |
Работа программы с отрицательными весами |
|
3 |
6 0 - 1 : 2 1 - 2 : 3 2 - 3 : 4 3 - 4 : 5 4 - 1 : 6 5 |
In.txt 5 6 |
Работа программы при существовании изолированных вершин |
||
4 |
|||||
5 |
8. Вывод
Программа работает правильно на всех проведенных тестах.
9. Список используемой литературы
1. «Практикум на ЭВМ. Алгоритмы» П 691 Учебное пособие / В.П. Хиценко, Т.А. Шапошникова - Новосибирск: Изд-во НГТУ, 2004. - 112 с.
2. «Структуры данных и алгоритмы» С 873 Методические указания к КР для студентов I курса / В.П. Хицен ко, Т.А. Шапошникова – Новосибирск: Изд-во НГТУ, 2008 г. 56 с.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.