0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 3

Матрица смежности, ввод через рёбра

20.01.2014, 01:34. Показов 2824. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста!!!! Есть программа которая находит достижимые вершины из заданной вершины, я использую матрицу смежности, ввожу её из стрингрида. Мне нужно, чтобы матрица смежности задавалась путём ввода рёбер.
Вот код программы. Благодарствую.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n,m;
int s[10][10];
bool mf[10];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int i;
n=StrToInt(Edit1->Text);
StringGrid1->RowCount=n;
StringGrid1->ColCount=n;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ int i,j;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
     s[i][j]=StrToInt(StringGrid1->Cells[j-1][i-1]);
}
//---------------------------------------------------------------------------
void poisk(int n,int m)
{int i_st, i_end, i;
 int Q[10];
for (int i=1;i<=n;i++)
mf[i]=false;
mf[m]=true;
Q[1]=m;
 i_st=1;
 i_end=2;
while (i_st<i_end)
  {
  for (int i=1;i<=n;i++)
  if ((s[Q[i_st]][i]==1) && (mf[i]==false))
  {
    Q[i_end]=i;
    mf[i]=true;
    i_end+=1;
  }
  i_st+=1;
  }
}
//---------------------------------------------------------------------------
void vivod(int n,TStringGrid *p)
{int i;
 bool fl;
 fl=false;
for (int i=1;i<=n;i++)
 if (mf[i]==true)
 {
 p->Cells[i-1][0]=IntToStr(i);
 fl=true;}
 
 if (!fl)
 ShowMessage("Íåò äîñòåæèìûõ âåðøèí");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
m=StrToInt(Edit2->Text);
poisk(n,m);
vivod(n,StringGrid2);
}
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.01.2014, 01:34
Ответы с готовыми решениями:

Графы. Ввод матрицы смежности, матрица инцидентности и список инцидентности неориентированного графа
Здраствуйте. Помогите пожалуйста, а то вообще не врубаюсь в это. Надо написать процедуры ввода матрицы смежности, матрицы инцидентности...

Граф (Матрица смежности, список смежности)
Понятия неимею, как можно написать код по условию программы так как с графами не бум бум. Неориентированный граф представляет собой...

Нужны преобразования: список смежных вершин -> список инцидентных ребер -> матрица инцидентности -> матрица смежности
Нужны такие преобразования: список смежных вершин -&gt; список инцидентных ребер -&gt; матрица инцидентности -&gt; матрица смежности. С++ ...

1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.01.2014, 01:46
Вот Дейкстра с вводом ребер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <clocale>
#include <vector>
using namespace std; // используем пространство имен std по-умолчанию
 
int main()
{
    setlocale(LC_ALL, "Russian");
    // здесь задаете размерность матрицы
    const int N = 10;
    // --------------------------объявление переменных--------------------------
    bool FIKS[N]; //false - вершина не рассмотрена, true - рассмотрена
    int MIN_WEG[N]; // текущие кратчайшие расстояния до соответствующей вершины
    int VON_PUNKT[N]; // номера вершин
    int DUG[N][N]; // матрица расстояний (смежности)
    int start, end; // номер стартовой  и конечной вершин
 
    // ------------------------------инициализация------------------------------
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            // расстояние между вершинами это очень большое число, т.о. мы
            // показываем, что они не связанны
            DUG[i][j] = 999;
    int n; // количество ребер (связей)
    cout << "Введите количество ребер графа: ";
    cin >> n;
    int from, to, length; // переменные для задания матрицы расстояний
    for (int i=0; i < n; i++)
    {
        cout << "Введите вершину (откуда): ";
        cin >> from;
        cout << "Введите вершину (куда): ";
        cin >> to;
        cout << "Введите расстояние: ";
        cin >> length;
        if (from < 0 || from >= N || to < 0 || to >= N || to == from ||
            length < 0)
        {
            cout << "Ошибка ввода\n";
            i--;
        }
        else // заносим расстояние в матрицу
            DUG[from][to] = DUG[to][from] = length;
    }
 
    cout << "Введите начальную вершину: ";
    do cin >> start; while (start < 0 || start >= N); // проверка введ. значений
    cout << "Введите конечную вершину: ";
    do cin >> end; while (end < 0 || end >= N || end == start); // проверка
    for (int i = 0; i < N; i++)
    {
        FIKS[i] = false; // все вершины непосещенные
        VON_PUNKT[i] = start;
    }
 
    // перенести i-ую строчку матрицы DUG в массив MIN_WEG
    for (int i = 0; i < N; i++)
        // мин. расстояния равны текущим до начальной вершины
        MIN_WEG[i] = DUG[i][start];
    FIKS[start] = true; // начальная вершина посещена
    VON_PUNKT[start] = 0; // находимся в текущей вершине
 
    // --------------------------------общий шаг--------------------------------
    bool yes = false; // флаг, установлен ли минимум
    int min = 0, min_index = 0;
    for (int k = 0; k < N; k++)
    {
        // находим минимум
        yes = false;
        for (int i = 0; i < N; i++)
            if (FIKS[i] == false) // если вершина не посещена
            {
                if (yes == false) // если минимум не установлен
                {
                    // устанавливаем его (равен тек. минимальному расстоянию)
                    min = MIN_WEG[i];
                    min_index = i;
                    yes = true;
                }
                else
                if (MIN_WEG[i] < min) // если кратчайшее расстояние меньше мин.
                {
                    // минимум равен текущему кратчайшему расстоянию
                    min = MIN_WEG[i];
                    min_index = i; // индекс минимума равен i
                }
            }
        FIKS[min_index] = true; // вершина с мин. расстоянием посещена
        for (int j = 0; j < N ; j++)
        // если есть более короткий путь, то изменяем след. вершину на ту,
        // которую следовало бы посетить, чтобы срезать
            if (MIN_WEG[j] > MIN_WEG[min_index] + DUG[min_index][j])
            {
                MIN_WEG[j] = MIN_WEG[min_index] + DUG[min_index][j];
                VON_PUNKT[j] = min_index;
            }
    }
 
    // ------------------------------выдача ответа------------------------------
    vector<int> v; // вспомагательный вектор для выдачи ответа
    // новая вершина равна переходу из текущей пока не пришли в начальную
    for(int z = end; z != start; z = VON_PUNKT[z])
        // заносим в вектор вершины, пройденные от конечной до начальной
        v.push_back(z);
    v.push_back(start); // записываем начальную вершину
    // двигаемся с конца вектора до начала, выводя содержимое на экран
    for (vector<int>::reverse_iterator cur = v.rbegin(); cur != v.rend(); cur++)
        cout << *cur << " ";
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2014, 01:46
Помогаю со студенческими работами здесь

Матрица смежности
В галактике «Milky Way» на планете «Snowtlake» есть N городов, некоторые из которых соединены дорогами. Император галактики «Milky Way»...

Матрица смежности
По заданной матрице смежности определить число циклов длины 3 и длины 4. 0 1 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 ...

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

Матрица смежности
Не до конца понимаю чем отличается обычная матрица и матрица смежности, как она выглядит в программном коде?

Матрица смежности
Найти максимальное по числу вершин подмножество попарно несмежных вершин данного графа ( с n&lt;=10 вершинами).


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru