Автор: Пользователь скрыл имя, 16 Января 2011 в 23:09, курсовая работа
Останнім часом дослідження в областях, що традиційно відносяться до дискретної математики, займають усе більш помітне місце. Поряд з такими класичними розділами математики, як математичний аналіз, диференціальні рівняння, у навчальних планах спеціальності "Прикладна математика" і багатьох інших спеціальностей з'явилися розділи по математичній логіці, алгебрі, комбінаториці і теорії графів. Причини цього неважко зрозуміти, просто розглянувши задачу, розв'язувану пошуку найкоротшого шляху в графі
1.Вступ……………………………………………………………………..…………3
2.Елементи теорії графів:
Основні визначення……………………………………………………………..………..3
Ізоморфізм, гомеоморфізм……………………………………………………….…………4
Шляхи і цикли……………………………………………………………………………5
Дерева…………………………………………………………………………..5
Цикломатичне число і фундаментальні цикли……………….……….…………………..8
Компланарні графи ………………………………………………………………..……….8
Розфарбування графів………………………………………………………………….….10
Графи з атрибутами ……………………………………………………………….………12
Незалежні безлічі і покриття ………………………………………………………..……12
3.Задача знаходження мінімального шляху в графах:
Алгоритм Дейкстра…………………………………………………………….….………14
Текст програми написаної на основі алгоритму Дейкстра………………………..…….15
Результат виконання програми…………………………………………………………...17
Графічне зображення початкового графа та дерево мінімальних шляхів після виконання рограми……………………………………………………………….……..…18
4.Висновок………………………..……..………………………………………….18
5. Література ………………………………………………………………………..
/* Алгоритм
пошуку дерева найкоротших
/* Е.Дейкстра
1959 р.
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
int load_matrix(int n, double* weigh); /* Уведення матриці ваг */
int deik(int n, int s, double* weigh, int* Q, double* L); /* Алгоритм пошуку */
void print(int
n, int* Q, double* L); /* Висновок результату */
void main(void){
int n=0,s=0,ret=0;
double *weigh;
int* Q; /* Масив міток покажчиків на попередню вершину */
double*
L; /* Масив найдених ваг шляху до вершини */
printf("\nАлгоpитм
пошуку дерева найкоротших
printf("Е.Дейкстpа, 1959 р.\n");
printf("\nВведіть кількість вершин..");
scanf("%d",&n);
if (n <= 1){
printf("\
exit(1);
}
printf("\nВведіть початкову вершину..");
scanf("%d",&s);
s--;
if ((s < 0)||(s > (n-1))){
printf("\
exit(1);
}
Q=malloc(n*sizeof(int));
L=malloc(n*sizeof(
weigh=malloc(sizeof(
if ((weigh == NULL)||(Q == NULL)||(L == NULL)){
printf("\
exit(2);
}
ret=load_matrix(n,weigh)
if (ret != 0){
printf("\nПомилка введення даних!\n");
exit(5);
}
ret=deik(n,s,weigh,Q,L);
if (ret != 0){
switch (ret){
case 1 :
printf
exit(
case 2 :
printf
exit(
}
}
print(n,Q,L);
free(weigh);
free(Q);
free(L);
}
int load_matrix(int n, double* weigh){
int i,j,k;
double tmp;
for (i=0; i < n; i++){
for (j=0; j < n; j++){
weigh[n*i+j]
}
}
printf("\nВведіть послідовно ваги ребер для зазначених чи вершин -1 для несуміжних.");
for (i=0; i < n; i++){
for (j=i+1; j < n; j++){
printf("\
k=scanf("%
if (k != 1){return(1);}
weigh[i*n+j]
}
}
return(0);
}
int deik(int n,int s, double* weigh, int* Q, double* L){
int i,j,k;
int* QI; /* Масив індикаторів сталості міток покажчиків */
double
tmp;
QI=calloc(n,sizeof(int))
if
(QI == NULL){return(2);}
QI[s]=1;
for (i=0; i < n; i++){
Q[i]=(-1);
L[i]=DBL_MAX;
}
Q[s]=s;
L[s]=0;
weigh[n*(n-1)+s]=0;
for (k=0; k < n; k++){ /* Основний цикл по вершинах */
for (i=0; i < n; i++){ /* Цикл по рядках матриці ваг */
for (j=i+1; j < n; j++){ /* Цикл по стовпцях матриці ваг */
if ((QI[i]+QI[j] == 1)&&
(QI[i]*QI[j] == 0)&&
(weigh[i*n+
(((QI[i] == 1)&&((L[i]+weigh[i*n+j]) < L[j]))||
((QI[j] == 1)&&((L[j]+weigh[i*n+j]) < L[i])))){
if (QI[i] == 1){
}
else{
}
}
}
}
for (tmp=DBL_MAX,i=0; i < n; i++){
if ((tmp > L[i])&&(QI[i] == 0)){
tmp=L[i];
j=i;
}
}
QI[j]=1;
}
free(QI);
return(0);
}
void print(int n, int* Q, double* L){
int i;
printf("\n\nДеpево найкоротших шляхів:");
for (i=0; i < n; i++){
printf("\nВеpшина: %d Предок: %d Вага: %5.2lf",i+1,Q[i]+1,L[i]);
}
}*
Результат
виконання програми
Алгоритм пошуку дерева найкоротших шляхів у зваженому графі.
Е.Дейкстра,
1959 р.
Уведіть кількість вершин.. 6
Уведіть початкову вершину.. 6
Уведіть послідовно ваги ребер для зазначених чи вершин -1 для несуміжних.
Вершини 1 і 2 2
Вершини 1 і 3 -1
Вершини 1 і 4 2
Вершини 1 і 5 -1
Вершини 1 і 6 5
Вершини 2 і 3 2
Вершини 2 і 4 -1
Вершини 2 і 5 2
Вершини 2 і 6 -1
Вершини 3 і 4 -1
Вершини 3 і 5 -1
Вершини 3 і 6 12
Вершини 4 і 5 1
Вершини 4 і 6 2
Вершини
5 і 6 5
Дерево найкоротших шляхів:
Вершина: 1 Предок: 4 Вага: 4.00
Вершина: 2 Предок: 5 Вага: 5.00
Вершина: 3 Предок: 2 Вага: 7.00
Вершина: 4 Предок: 6 Вага: 2.00
Вершина: 5 Предок: 4 Вага: 3.00
Вершина:
6 Предок: 6 Вага: 0.00*
Графічне
зображення початкового
графа та дерева мінімальних
шляхів після виконання
програми
Тестовий зв'язний зважений для алгоритму пошуку дерева шляхів з вершини 6 (Е. Дейкстра 1959р.)
|
Рішення: дерево найкоротших шляхів з вершини 6 |
4.Висновок
Ця
курсова робота показує що дискретна
математика, поряд з такими класичними
розділами математики, як математичний
аналіз, диференціальні рівняння, у
навчальних планах спеціальності "Прикладна
математика" і різні розділи
по математичній логіці, алгебрі, комбінаториці
і теорії графів тісно пов’язані із сучасним
програмуванням. Причини цього неважко
зрозуміти, просто розглянувши задачу,
у цій курсовій роботі, яка за допомогою
алгоритму Е. Дейкстра має змогу пошуку
найкоротшого шляху в графі .
5.Література