Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

10.3.3. Реализация графа с помощью матрицы смежности

При представлении графа матрицей смежности информация о графе задается следующим образом:

  • количество вершин – целое число (n);

  • метки вершин – массив из n объектов (v[n]);

  • связи вершин и веса дуг – матрица смежности (a[n][n]).

Матрица смежности – это квадратная матрица, размеры которой равны количеству вершин (n). Элемент матрицы смежности а[i][j] равен значению дуги, соединяющей вершины v[i] и v[j], или 0, если нет дуги между вершинами v[i] и v[j]. Если орграф не взвешенный, то значение а[i][j]=1, если есть дуга между вершинами i и j, и а[i][j]=0, если нет дуги между i и j. Матрица смежности для графа, изображенного на рис. 5, приведена на рис. 7.

0

7

9

0

0

0

0

0

0

0

0

0

0

10

0

0

0

2

0

15

11

0

6

0

0

0

0

0

0

0

14

0

0

0

9

0

Рис. 7. Матрица смежности

Матричная модель графа упрощает реализацию операций над графами. Недостатком представления графа матрицей смежности является необходимость выделять память под всю матрицу, размер которой пропорционален n2, даже если дуг в графе мало. Как следствие этого время выполнения операций над графом, например, поиска в графе также пропорционально n2.

Пример программы, выполняющей операции над графом, реализованном с помощью матрицы смежности. Операции:

  • создание пустого графа;

  • добавление вершины;

  • добавление дуги;

  • удаление вершины;

  • удаление дуги;

  • вывод смежных вершин заданной вершины;

  • получение веса дуги;

  • вывод матрицы смежности.

Метки вершин графа заданы символами. Максимальное количество вершин задано глобальной константой.

#include <iostream.h>

#include <iomanip.h>

#include <conio.h>

const int size=10;

//Создание пустого графа

void create(int a[size][size],int &n);

//Добавление вершины с меткой name

void add_v( char v[size], char name, int &n);

//Добавление дуги между вершинами name1 и name2 с весом х

void add_a(char name1, char name2, int x, int a[size][size], char v[size], int n);

//Получение номера вершины по ее метке name

int get_v(char v[size], int n, char name);

//Удаление вершины по ее метке name

void del_v(char v[size], char name, int &n, int a[size][size] );

//Удаление дуги между вершинами name1 и name2

void del_a(char name1, char name2, int a[size][size], char v[size], int n);

//Получение веса дуги между вершинами name1 и name2

int get_value(char name1, char name2, int a[size][size], char v[size], int n);

//Вывод матрицы смежности

void output_a(int a[size][size], int n);

void main()

{

int n; //количество вершин

int a[size][size]; //матрица смежности

int x; //вес дуги

char v[size]; //массив вершин

char name1, name2, name; //метки вершин

create(a,n); //инициализация матрицы смежности, n=0

output_a(a,n); //вывод матрицы смежности

//Добавление вершин

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

{

cout <<"name:" ; cin>>name;

add_v( v, name, n);

}

for (int i=1; i<=7; i++) //цикл добавление дуг

{

cout <<"name1:" ; cin>>name1;

cout <<"name2:" ; cin>>name2;

cout <<"x:" ; cin>>x;

add_a(name1,name2,x,a,v, n);

}

output_a(a,n);

cout <<"name:" ; cin>>name;

output_v(name, v, n, a); //вывод смежных с name вершин

//Получение веса дуги между вершинами name1 и name2

cout <<"name1:" ; cin>>name1;

cout <<"name2:" ; cin>>name2;

x=get_value(name1,name2,a,v,n);

if (x==-1)

cout<<"error"<<endl;

else

cout<<x<<endl;

//Удаление вершины с меткой name

cout <<"name:" ; cin>>name;

del_v( v, name, n,a);

output_a(a,n);

//Удаление дуги между вершинами name1 и name2

cout <<"name1:" ; cin>>name1;

cout <<"name2:" ; cin>>name2;

del_a(name1,name2, a,v, n);

output_a(a,n);

getch();

}

void create(int a[size][size], int &n)

{

n=0;

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

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

a[i][j]=0;

}

void add_v( char v[size], char name, int &n)

{

if(n<=size)

{

v[n]=name;

n++;

}

else

cout<<"error"<<endl;

}

void add_a(char name1, char name2, int x, int a[size][size], char v[size], int n)

{

int i, j;

i=get_v(v,n,name1);

if (i==-1){cout<<"error"; return;}

j=get_v(v,n,name2);

if (j==-1){cout<<"error"; return;}

a[i][j]=x;

}

int get_v(char v[size], int n, char name)

{

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

if(v[i]==name)

return i;

return -1;

}

void del_v(char v[size], char name, int &n, int a[size][size] )

{

int p, i, j;

p=get_v(v,n,name);

if (p==-1){cout<<"error"; return;}

for(i=p; i<=n-2; i++)

v[i]=v[i+1];

for(i=0; i<=p-1; i++)

for(j=p; j<=n-2; j++)

a[i][j]=a[i][j+1];

for(i=p; i<=n-2; i++)

for(j=p; j<=n-2; j++)

a[i][j]=a[i+1][j+1];

for(i=p; i<=n-2; i++)

for(j=0; j<=p-1; j++)

a[i][j]=a[i+1][j];

n--;

}

void del_a(char name1,char name2,int a[size][size],char v[size], int n)

{

int i, j;

i=get_v(v,n,name1);

if (i==-1){cout<<"error"<<endl; return ;}

j=get_v(v,n,name2);

if (a[i][j]==0){cout<<"error"<<endl; return ;}

a[i][j]=0;

}

int get_value(char name1, char name2, int a[size][size], char v[size], int n)

{

int i, j;

i=get_v(v,n,name1);

if (i==-1){cout<<"error"<<endl; return -1;}

j=get_v(v,n,name2);

if (a[i][j]==0){cout<<"error"<<endl; return -1;}

return a[i][j];

}

void output_a(int a[size][size], int n)

{

if (n==0)

cout<<"a is empty";

else

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

{

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

cout<<setw(5)<<a[i][j];

cout<<endl;

}

cout<<endl; }