Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №4

.doc
Скачиваний:
36
Добавлен:
02.05.2014
Размер:
46.08 Кб
Скачать

Лабораторная работа N 4

Тема:

Алгоритм поиска остовного графа.

Цель работы:

Изучение алгоритмов поиска остовного графа. Разработка программы, реализующей этот алгоритм.

Краткая теория:

С самого начала рассмотрим понятие «остовного графа». Деревом называется связный граф, не содержащий циклов. Любой граф без циклов называется ациклическим (лес). Компонентами леса являются деревья. Пусть H-остовной подграф произвольного графа G. Если на каждой области связанности графа G, графом H порождается дерево, то H называется остовом (каркасом) графа G. В каждом графе существует остов : разрушая в каждой компоненте циклы, т.е. удаляя лишние ребра, придем к остову. Остов в графе легко найти с помощью поиска в ширину.

Алгоритм поиска остовного графа: Суть алгоритма состоит в том, что при поиске в ширину мы используем две очереди, в одну из которых из списка смежности попеременно загружаются номера вершин, смежных с вершинами, находящимися в другой очереди. При этом ликвидируются связи между вершинами в одной очереди и связи (кроме одной) между каждой вершиной текущей очереди и вершинами из "предыдущей" очереди. Таким образом, когда при загрузке номеров вершин мы получим пустую очередь, то это значит что поиск остовного графа для данной компоненты связанности завершен. Чтобы определить, обработаны ли все компоненты связанности и для того, чтобы избежать зацикливания при поиске в ширину, используется метка вершин. Если после очередного окончания поиска не остается больше непомеченных вершин, это значит что остовной граф выделен, в противном же случае за исходную вершину берется любая из непомеченных вершин и поиск повторяется снова.

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

#include<conio.h>

#include<stdio.h>

#include<stdlib.h>

typedef struct md

{

int g;

struct md *next;

}G;

int m;

G **head,**head1,*temp,*ohead=NULL,*prev;

void ss(void);

void outss(void);

void input1(int);

int output(void);

void main()

{

int i,n,u,w,h,*x,f;

G *current,*p,*p1;

char ch;

clrscr();

ss();

while(1)

{

clrscr();

for(i=0;i<m;i++)

head1[i]=NULL;

x=(int*)malloc(m*sizeof(int));

for(i=0;i<m;i++)

x[i]=0;

printf("vvedite vershinu:");

scanf("%d",&n);

input1(n);

x[n-1]=1;

n=0;

h=0;

do

{

if(ohead==NULL)

{

u=++h;

if(x[u-1]==0)

{

x[u-1]=1;

input1(u);

u=output();

n++;

}

}

else

{

u=output();

x[u-1]=1;

n++;

}

current=head[u-1];

while(current->g)

{

w=current->g;

if(x[w-1]==0)

{

input1(w);

temp=(G*)malloc(sizeof(G));

temp->g=w;

temp->next=NULL;

p=head1[u-1];

if(head1[u-1]!=NULL)

{

while(p->next!=NULL)

p=p->next;

p->next=temp;

}

else head1[u-1]=temp;

x[w-1]=1;

p=head[w-1];

f=0;

if(p!=NULL)

while(p!=NULL)

{

if(p->g==u)f=1;

p=p->next;

}

if(f==1)

{

p1=(G*)malloc(sizeof(G));

p1->g=u;

p1->next=NULL;

head1[w-1]=p1;

}

}

current=current->next;

}

}

while(n<m);

outss();

printf("\n1-Prodoljiti\n");

printf("2-Exit\n");

ch=getche();

getch();

if(ch=='2') return;

}

}

void ss()

{

int i,j;

G *current,*prev;

printf("Vvedite cislo vershin:");

scanf("%d",&m);

head=(G**)malloc(m*sizeof(G));

head1=(G**)malloc(m*sizeof(G));

for(i=0;i<m;i++)

{

head[i]=NULL;

printf("Vershina x[%d]:",i+1);

do

{

current=(G*)malloc(sizeof(G));

if(head[i]==NULL)

head[i]=current;

else prev->next=current;

scanf("%d",&current->g);

current->next=NULL;

prev=current;

}

while(current->g);

}

}

void outss()

{

int i;

G *current;

for(i=0;i<m;i++)

{

current=head1[i];

printf("Vershina x[%d]:",i+1);

while(current)

{

printf("%d,",current->g);

current=current->next;

}

printf("0\n");

}

getch();

}

void input1(int n)

{

G *current;

//v shirinu

current=(G*)malloc(sizeof(G));

if(ohead==NULL)

ohead=current;

else prev->next=current;

current->g=n;

current->next=NULL;

prev=current;

current=ohead;

while(current)

{

current=current->next;

}

}

int output()

{ int k;

G *p;

p=ohead;

k=ohead->g;

ohead=p->next;

free(p);

return k;

}

Вывод: был задан граф в виде списка смежности

1: 2 3 0

2: 4 0

3: 4 0

4: 0

и был получен результат в виде списка смежности

1: 2 3 0

2: 4 0

3: 0

4: 0