Государственный комитет Российской Федерации по телекоммуникациям

Сибирский государственный университет

телекоммуникаций и информатики

Лабораторная работа 5

По дисциплине « Дискретная Математика»

Поиск компонент связности графа

Работу выполнил

студент 2 курса

группы ПБТ-12

Работу проверил

Работа защищена

«___» __________2013г.

С оценкой «_______»

Новосибирск 2013

Задание. Граф задан его матрицей смежности. Требуется определить количество компонент связности этого графа. При этом должны быть конкретно перечислены вершины, входящие в каждую компоненту связности.

Выбор алгоритма поиска компонент связности – произвольный. Например, приветствуется использование одного из видов обхода.

Пользователю должна быть предоставлена возможность редактировать исходную матрицу, т. е. изменять исходный граф без выхода из программы. Предусмотреть также возможность изменения количества вершин.

Решение:

1.  Описание программы:

Основными переменными являются массивы целых чисел A - хранит в себе матрицу смежности, cp – является черным списком пройденных вершин,

Основными функциями являются: newElement(), CreateMatriX(),completePoint(),searchCSS(), TopRound()

Функция searchCSS() проверяет, нужно ли обходить данную точку или нет, для выявления КСС.

Функция TopRound() обходит вершину и анализирует сколько путей от нее и сколько в нее, в соответствии с этим делает вывод о КСС.

Функция newElement () служит для ввода кол-ва вершин и проверки на ошибки, переход к созданию матрицы;

НЕ нашли? Не то? Что вы ищете?

Функция CreateMatriX() организует ввод 1 и 0 в матрицу смежности и дальнейший переход к поиску в ширину;

Функция completePoint() опускает флаги в 0 и говорит о том что ни одна вершина не была пройдена, со временем массив заполнится единицами и не позволит выводить одно и то же

Вспомогательными же функциями являются: elemMatriX ()-организует проверку на правильность заполнения ячеек матрицы, Menu() – организует интерактивное меню, , matriXS – выводит на экран матрицу смежности, crossPoint – поиск самой потенциальной точки по матрице смежности.

Алгоритм решения задачи: Вводим количество n вершин, заполняем матрицу n X n элементов, далее просматриваем какая точка наиболее интересна для обхода, далее начинаем от это точки путь, постепенно записывая в out путь. При выполнении максимального количества шагов по вершинам (все послед шаги приводящие к циклу) выводим конечное выражение обхода графа. Выводим меню.;

2.  Текст программы:

#include <stdio. h>

#include <conio. h>

#include <stdlib. h>

int A[20][20];

int cp[20];

void TopRound(int top, int n)

{

int I[20];

int O[20];

int b=0,i, j,k=0,q=0;

for(j=1;j<=n;j++)

{

if (A[top][j]==1 && top!=j)

{

k++;

I[k]=j;

}

if(A[j][top]==1 && j!=top)

{

q++;

O[q]=j;

}

}

printf("{");

printf("%2d",top);

i=1;j=1;

while(i<k+1 && j<q+1)

{

if(I[i]>O[j])

{

j++;

}

else if(I[i]<O[j])

{

i++;

}

else if(I[i]==O[j])

{

b=I[i];

cp[b]=1;

printf("%2d",I[i]);

i++;

j++;

}

}

printf("}\n");

}

void searchCSS(int n)

{

printf("KSS:\n");

for(int i=1;i<=n;++i)

{

if(cp[i]==0)

{

cp[i]=1;

TopRound(i, n);

}

}

}

void matriXS(int n)

{

for(int i=0;i<=n;i++)

{

for(int j=0;j<=n;j++)

{

if(i==0 && j==0)

{

printf(" ");

}

else

{

printf("%2d",A[i][j]);

}

}

printf("\n");

}

}

void elemMatriX(int i, int j)

{

int iac = 0;

printf("Zapolnjaem, jachejku %d-%d\n",i, j);

scanf("%d",&iac);

if (iac==0 || iac==1)

{

A[i][j]=iac;

}

else

{

printf("Zadannoe znachenie mozhet prinimat' 1 ili 0\n");

elemMatriX(i, j);

}

}

void newElement();

void Menu(void)

{

printf("\n MENU \n");

printf(" 1 - Izmenit matricu otnoshenia i kolichestvo vershin\n");

printf(" Esc - Vyhod\n");

switch (getch())

{

case 49: newElement();break;

case 27: break;

default: Menu();

}

}

void completePoint(int n)

{

for(int i=1;i<=n;++i)

{

cp[i]=0;

}

}

void CreateMatriX(int n)

{

for(int i=0;i<=n;i++)

{

for(int j=0;j<=n;j++)

{

if(i==0 && j==0)

{

for(int e=1;e<=n;e++)

{

A[e][0]=e;

}

}

if(i==0 && j>0)

{

A[0][j]=j;

}

if(i>0 && j>0)

{

clrscr();

matriXS(n);

printf("Martica smezhnosti\n");

elemMatriX(i, j);

}

}

}

clrscr();

matriXS(n);

printf("Matrica smezhnosti zapolnena. Nazhmite ljubuju klavishu dlja prodolzhenija\n");

completePoint(n);

getch();

searchCSS(n);

Menu();

}

void newElement()

{

int n;

printf("Vvedite n vershin\n");

scanf("%d",&n);

if(n<0)

{

printf("kolichestvo vershin ne mozhet byt' otricatel'noj ili ravnoj 0\n");

newElement();

}

else

{

CreateMatriX(n);

}

}

int main()

{

clrscr();

newElement();

getch();

}

3.  Описание входных данных:

n = 6;//Количество вершин.

Заполняем матрицу смежности:

Результат: