Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/75: Рейтинг темы: голосов - 75, средняя оценка - 4.77
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Граф на основе матрицы смежностей

08.11.2012, 01:07. Показов 14269. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо решить задачу о поиске числа Исенбаева (то же самое что и Число Эрдёша только фамилия другая). Само условие задачи здесь. Подобные задачи решаются с помощью создания некого графа и поиска в ширину, но проблема возникла в том что одно дело писать
array [1][1]=1 чтобы показать что путь из 1 в 1 есть, а другое дело когда у тебя фамилии, я ведь не могу написать array[Vasya][Petya]=1 чтобы указать что связь от Васи к Пете есьть, так как у меня же мне тогда поступить?

Посоветуйте пожалуйста что из стандартных классов java применить и как для представления таких данных, ато что-то в рамках java и этой задачи я не могу собраться с мыслями.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2012, 01:07
Ответы с готовыми решениями:

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

Граф задан своей матрицей смежностей, вывести на экран все связные вершины
Граф задан своей матрицей смежностей. Вывести на экран все связные вершины...очень скоро нужно...извините за срочность

Граф задается своей матрицей смежностей; вывести на экран матрицу инцидентности графа.
Пожалуйста помогите с задачкой: Граф задается своей матрицей смежностей; вывести на экран матрицу инцидентности графа. Может я много...

13
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
08.11.2012, 01:41
Ниже написано моё непрофессиональное мнение.

Поскольку матрица смежности есть отображение S*S -> Bool, где S в данном случае строка, то по смыслу подходит Map<Pair<String,String>,Boolean>.
Однако можно поступить по-другому: закодировать каждое имя (например, составить перечень имён в виде массива, индекс будет кодом этого имени) и писать array[getId(Vasya)][getId(Petya_code)]
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
08.11.2012, 01:57  [ТС]
Mysterious Light, я пришёл к выводу о заведении некоего Map<String, List<String>>. В общем с добавлением вершин теперь проблем нет, с проверкой есть ли вершина тоже (удалять мне всё равно их не надо), а вот как мне распечатать весь список по человечески? Ну в самом деле не так же:
Java
1
2
3
4
5
6
7
8
9
        Map<String, List<String>> vertexMap = graph.getVertexMap();
        Collection<List<String>> values = vertexMap.values();
        Iterator<List<String>> iterator = values.iterator();
        while(iterator.hasNext())
        {
            List<String> next = iterator.next();
            next.iterator();
            while ...
        }
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
08.11.2012, 02:07
Почему бы и нет? В конечном счёте, на то он и список, чтоб его можно было итератором пробежать.
Java
1
2
3
4
5
6
7
8
Map<String, List<String>> vertexMap = graph.getVertexMap();
StringBuilder sb = new StringBuilder();
for(Map.Entry<String,List<String>> line : vertexMap.entrySet()) {
    sb.append(line.getKey()).append(" : ");
    for(String name : line.getValue())
        sb.append(name).append(", "); 
    sb.append("\n");
}
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.11.2012, 18:40
Джентльмены, зачем усложняете?
Матрица смежности это двумерный массив весов.
Столбец и строка имеют соответствующее "имя".
Пример:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        String[] names = {"Vasya", "Petya", "Kolya"};
        double [][] matrix = {
                {0, 1, 1.1},
                {1, 0, 1.2},
                {1.1, 1, 0}
        };
 
        for (int i = 0; i < matrix.length; ++i)
            for (int j = 0; j < matrix[i].length; ++j)
                if (matrix[i][j] == 0)
                    System.out.printf("No path from %s to %s\n", names[i], names[j]);
                else
                    System.out.printf("Path from %s to %s weights %.2f\n", names[i], names[j], matrix[i][j]);
    }
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
08.11.2012, 20:46  [ТС]
lemegeton, в принципе ваша идея с матрицей хорошая, возможно я и правда слишком усложняю, вот только поиск в ширину так просто как Вы написали не делается, по вашему варианту так пути ищутся только к соседям что пользы особой не приносит
Java
1
2
3
4
        double [][] matrix = {
                {1, 1, 0},
                {1, 0, 1},
                {0, 0, 0}
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
09.11.2012, 00:03
Цитата Сообщение от lemegeton Посмотреть сообщение
Джентльмены, зачем усложняете?
Матрица смежности это двумерный массив весов.
Столбец и строка имеют соответствующее "имя".
Вы, по сути, предлагаете то, о чём я вначале упомянул: каждому имени сопоставить число, Васе 1, Петя 2 и т.д. и рассматривать матрицу смежности как массив. Я так понял, ТС этот вариант неинтерестен. Его тоже можно понять: матрица смежности должна отвечать на вопрос «соединены ли две конкретные вершины, заданные своими именами», без дополнительного шаманства, когда сначала происходит кодировка имён, а после — обратная раскодировка по массиву имён.
Хотя я бы делал так, как Вы и предлагаете.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
09.11.2012, 08:30
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Вы, по сути, предлагаете то, о чём я вначале упомянул: каждому имени сопоставить число, Васе 1, Петя 2 и т.д. и рассматривать матрицу смежности как массив.
Да. Сопоставление в естественном порядке. С примером.

Цитата Сообщение от Gepar Посмотреть сообщение
lemegeton, в принципе ваша идея с матрицей хорошая, возможно я и правда слишком усложняю, вот только поиск в ширину так просто как Вы написали не делается, по вашему варианту так пути ищутся только к соседям что пользы особой не приносит
Что-то вы не договариваете. Приведите пример.
Обычная же матрица смежности.
Пример простенького обхода в ширину:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        String [] names = {"Vasya", "Kolya", "Petya", "Ivan"};
 
        double [][] matrix = {
                {0, 1.1, 1, 3},
                {1, 0, 1.2, 2.2},
                {2, 1, 0, 0.25},
                {2, 1, 0, 0}
        };
 
        Queue<Integer> queue = new LinkedList<Integer>(Arrays.asList(0));
 
        while (!queue.isEmpty()) {
            int current = queue.poll();
            for (int i = current + 1; i < names.length; ++i)
                if (matrix[current][i] > 0) {
                    queue.add(i);
                    System.out.printf("Route from %s to %s costs %.2f\n", names[current], names[i], matrix[current][i]);
                    System.out.printf("Queue size is %d\n", queue.size());
                }
        }
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2012, 17:34  [ТС]
я решил уже задачу, когда буду у стационарника покажу свое решение, может кому будет интерено/полезно.
1
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 8
09.11.2013, 20:44
Цитата Сообщение от Gepar Посмотреть сообщение
я решил уже задачу, когда буду у стационарника покажу свое решение, может кому будет интерено/полезно.
Было бы очень кстати, у меня курсач с этим связан
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
11.11.2013, 11:26
очень кстати ))) Ruko, судя по дате поста от Gepar, он уже вполне мог закончить обучение и сейчас ему не до курсачей )
1
11.11.2013, 14:45

Не по теме:

на три часа пораньше -- был бы ровно год

1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
12.11.2013, 14:56  [ТС]
mutagen, не, учусь, магистратура ещё
Число Исенбаева где-то должно быть ...

Добавлено через 2 минуты
Нашёл решение что использовал тогда:
Java
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
package isenbaev;
 
import java.util.Map;
import java.util.List;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Collections;
 
public class UndirectedGraph {
 
    private HashMap<String, List<String>> vertexMap = new HashMap<String, List<String>>();
 
    public void addVertex(String vertexName) {
        if (!hasVertex(vertexName)) {
            vertexMap.put(vertexName, new ArrayList<String>());
        }
    }
 
    public boolean hasVertex(String vertexName) {
        return vertexMap.containsKey(vertexName);
    }
 
    public boolean hasEdge(String vertexName1, String vertexName2) {
        if (!hasVertex(vertexName1)) return false;
        List<String> edges = vertexMap.get(vertexName1);
        return Collections.binarySearch(edges, vertexName2) != -1;
    }
 
    public void addEdge(String vertexName1, String vertexName2) {
        if (!hasVertex(vertexName1)) addVertex(vertexName1);
        if (!hasVertex(vertexName2)) addVertex(vertexName2);
        List<String> edges1 = vertexMap.get(vertexName1);
        List<String> edges2 = vertexMap.get(vertexName2);
        edges1.add(vertexName2);
        edges2.add(vertexName1);
        Collections.sort(edges1);
        Collections.sort(edges2);
    }
 
    public Map<String, List<String>> getVertexMap() {
        return vertexMap;
    }
}
Java
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package isenbaev;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.TreeSet;
 
/**
 *
 * @author Gepar
 */
 
public class Isenbaev {
    
    static int getPos(String[] array, String whoNeed)
    {
        for(int i=0;i<array.length;i++)
            if(array[i].compareTo(whoNeed)==0)
                return i;
        return 0;
    }
    
    
    
    @SuppressWarnings("empty-statement")
    public static void main(String[] args) throws FileNotFoundException
    {
        Scanner scanner = new Scanner(new FileInputStream("input.txt"));
        TreeSet<String> hash = new TreeSet<>();//позволяет хранить список уникальных строк
        int size = scanner.nextInt();
        
        //считывание из файла фамилии учатсников комманд
        while(scanner.hasNext())
        {
            String s = scanner.nextLine();
            String[] split = s.split(" ");
            if(split.length!=3)//если в строке не 3 комманды значит попался какой-то мусор (или просто \n)
                continue;
            else //иначе добавляем все 3 фамилии в список
            {
                hash.add(split[0]);
                hash.add(split[1]);
                hash.add(split[2]);
            }
        }
        int peopleCount = hash.size();//сохраним количество уникальных фамилий
        
        //Массив для хранения уникальных фамилий
        //просто вытянем из списка все элементы по очереди в него
        String[] names = new String[peopleCount];
        Iterator<String> iterator = hash.iterator();
        int x=0;
        while(iterator.hasNext())
            names[x++]=iterator.next();
        scanner.close();//закрываем файл
        
        //открываем файл снова, на сей раз чтобы анализировать кто в какой команде находится
        scanner = new Scanner(new FileInputStream("input.txt"));
        scanner.nextLine();
        
        int [][] associates = new int[peopleCount][peopleCount];//матрица смежностей
        
        while(scanner.hasNext())
        {
            String s = scanner.nextLine();
            String[] split = s.split(" ");
            if(split.length!=3)
                continue;
            else
            {
                //получаем номера людей из команды в списке
                //(чтобы правильно заполнить матрицу смежностей)
                int first=getPos(names, split[0]);
                int second=getPos(names, split[1]);
                int third=getPos(names, split[2]);
                //System.out.println(split[0]+first+" "+split[1]+second+" "+split[2]+third);
                
                //добавляем связи между этими фамилиями в матрицу смежностей устанавливая 
                associates[first][first]=1;
                associates[first][second]=1;
                associates[first][third]=1;
                associates[second][first]=1;
                associates[second][second]=1;
                associates[second][third]=1;
                associates[third][first]=1;
                associates[third][second]=1;
                associates[third][third]=1;
            }
        }
        
        
        for(int i=0;i<associates.length;i++)
        {
            System.out.print(names[i]+" ");
            for(int j=0;j<associates[i].length;j++)
                System.out.print(associates[i][j]+" ");
            System.out.println();
        }
        System.out.print("\n\n\n\n");
        //  bool associates[][] = матрица смежности
//  int peopleCount = её размер
//  int isenbaevNumber[] = номера, заполнены INT_MAX, у Исенбаева сразу ноль
        int isenbaevPos = getPos(names,"Isenbaev");//узнаем номер Исенбаева в матрице смежностей чтобы установить его число = 0
        
        int[] isenbaevNumber = new int[peopleCount];//массив для хранения числа Исенбаева у каждого участника
        
        for(int i=0;i<peopleCount;i++)
            isenbaevNumber[i]= Integer.MAX_VALUE;
        isenbaevNumber[isenbaevPos]=0;
        
        Queue<Integer> queue = new LinkedList<>();
        Queue<Integer> queue2 = new LinkedList<>();
        boolean visited[] = new boolean[peopleCount];
        queue.add(isenbaevPos); // <-- номер Исенбаева
        int nextIsenbaevNumber = 1;
        while (!queue.isEmpty()) {
            while (!queue.isEmpty()) 
            {
            int next = queue.poll();
            if (visited[next]) {
                continue;
            }
            visited[next] = true;
            for (int i = 0; i < peopleCount; ++i) {
                if (associates[next][i]==1) {
                    if (isenbaevNumber[i] > nextIsenbaevNumber) {
                        isenbaevNumber[i] = nextIsenbaevNumber;
                    }
                    queue2.add(i);
                }
            }
        }
        Queue<Integer> temp = queue; queue = queue2; queue2 = temp;
        ++nextIsenbaevNumber;
    }
        
        //распечатка результатов
        for(int i=0;i<isenbaevNumber.length;i++)
        {
            System.out.print(names[i]+": ");
            if(isenbaevNumber[i]!= Integer.MAX_VALUE)
                System.out.println(isenbaevNumber[i]);
            else System.out.println("undefined");
        } 
    }
}
Добавлено через 2 минуты
Вижу местами код не шибко красивый, в частности глупо как-то я проставляю единички в 9 строк, но оставлю эти исправления новому студенту обеспокоенному этой задачей
1
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 8
29.11.2013, 00:58
Спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.11.2013, 00:58
Помогаю со студенческими работами здесь

Граф задается своей матрицей смежностей вывести на экране окружения каждой его вершины
Привет, ребят! Прошу Очень помочь! Граф задается своей матрицей смежностей. Вывести на экране окружения каждой его вершины. ...

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

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

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

Матрица инцидентности и смежностей
Представить граф в виде 1)матрицы смежности и матрицы инцидентности. Реализовать операторы: добавить вершину, вывод смежных вершин. На...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru