Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/86: Рейтинг темы: голосов - 86, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6

GraphViz

12.05.2013, 00:16. Показов 16549. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Нарисовалась проблема:

Имеется матрица смежности, я могу вынести в отдельный файл (типа .txt), так вот вопрос стоит в том, чтобы программно подать эту матрицу в GraphViz. Как лучше\проще это сделать? Передать напрямую в конфиг файл сабжа или для начала передать матрицу в .txt файл а потом ее оттуда считать, и собственно как это сделать.
Самая главная трудность заключается в том как подать матрицу на вход GraphVizа, мануалы что-то мало о чем мне поведали. Пожалуйста ответьте на примере вашего кода.

Да и еще, GraphViz ставил на винду.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2013, 00:16
Ответы с готовыми решениями:

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

Graphviz + русский
Здравствуйте, подскажите может кто сталкивался. В jbuilder-е реализую построение графа с помощью graphviz вот так: digraph G{ ...

Graphviz for NET (graphviz4net)
Кто умеет работать c graphviz, помогите в нём разобраться, пожалуйста. Задача вроде простейшая - на вход нужно подать кол-во элементов,...

12
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
13.05.2013, 01:06  [ТС]
ребята, нужен ответ, пожалуйста подсобите!
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.05.2013, 02:46
Лучший ответ Сообщение было отмечено как решение

Решение

Да там специальный формат файла - DOT , ты в него помещай свой граф
http://ru.wikipedia.org/wiki/D... B%D0%BA%29

А затем вызывай саму утилиту графвиза ( точно не помню какую, да и зависит от того что тебе надо ) и передавай ей параметром файл.
http://ru.wikipedia.org/wiki/Graphviz

Я неудачно пытался использовать как библиотеку Си в своей программе т.е. напрямую работать:
Визуализация графов - под линукс кстати получилось, а винде невкакую
3
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
13.05.2013, 09:25  [ТС]
Я как раз интересуюсь как синтаксически передать файл, а самое главное - как в .dot файл программно запихнуть (и всегда запихивать при работе моей программы) матрицу смежности\инцидентности, учитывая все нюансы синтаксиса dot.
Я предполагаю, что скорее всего придется в сей файл передавать полностью весь dot-текст формируемый в моей программе, только вот я еще не разобрался, в каком виде grafviz принимает граф(в виде матрицы или описанием связей-дуг) и как это реализовать в коде. Какие нибудь варианты еще есть?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.05.2013, 15:28
Я уже ответил ...
Цитата Сообщение от SwordRight Посмотреть сообщение
Я как раз интересуюсь как синтаксически передать файл
Цитата Сообщение от Avazart Посмотреть сообщение
и передавай ей параметром файл.
Формат dot прост - читай ссылки на вики...

Добавлено через 1 минуту
Цитата Сообщение от SwordRight Посмотреть сообщение
в виде матрицы или описанием связей-дуг)
Ввиде dot -файла в котором вершины и связи дуг.
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
13.05.2013, 16:21
Лучший ответ Сообщение было отмечено как решение

Решение

В самом простом виде можно как-то так реализовать:
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
#include <vector>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
typedef vector<int> adjacent_t;
typedef vector<adjacent_t> graph_t;
 
void read_graph(const char * fname, graph_t & g)
{
    ifstream inp(fname);
    int n, m;
    inp >> n >> m;
    g.clear();
    g.resize(n);
    for (int i = 0; i < m; ++i) {
        int from, to;
        inp >> from >> to;
        g[from].push_back(to);
    }
}
 
void write_dot(const char * fname, const graph_t & g)
{
    ofstream out(fname);
    out << "digraph {\n";
    for (size_t i = 0; i < g.size(); ++i) {
        out << "  " << i << ";\n";
    }
    for (size_t v = 0; v < g.size(); ++v) {
        for (auto u : g[v]) {
            out << "  " << v << " -> " << u << ";\n";
        }
    }
    out << "}\n";
}
 
int main()
{
    graph_t g;
    read_graph("input.txt", g);
    write_dot("g.dot", g);
    system("dot g.dot -Tpng -og.png");
}
Цитата Сообщение от input.txt
8 9
0 1
0 2
0 3
0 4
1 5
2 6
6 5
6 7
6 4
Цитата Сообщение от g.dot
digraph {
0;
1;
2;
3;
4;
5;
6;
7;
0 -> 1;
0 -> 2;
0 -> 3;
0 -> 4;
1 -> 5;
2 -> 6;
6 -> 5;
6 -> 7;
6 -> 4;
}
Миниатюры
GraphViz  
4
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.05.2013, 16:25
Кстати с помощью boost::graph можно выводить граф в формате graphviz
1
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
13.05.2013, 19:33
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати с помощью boost::graph можно выводить граф в формате graphviz
А как там куча специфических для graphviz атрибутов обрабатывается?

Вот мне, например, нужно какие-то вершины раскрасить в определенные цвета. Когда сам пишу dot, это все не сложно делается. А как в boost::graph это можно сделать?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.05.2013, 19:35
Цитата Сообщение от kamre Посмотреть сообщение
А как там куча специфических для graphviz атрибутов обрабатывается?
Вот мне, например, нужно какие-то вершины раскрасить в определенные цвета. Когда сам пишу dot, это все не сложно делается. А как в boost::graph это можно сделать?
Не имел дело ... просто увидел простой пример в интернете и попробовал его под Ubuntu - рабочий.
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
16.05.2013, 21:26  [ТС]
Цитата Сообщение от kamre Посмотреть сообщение
В самом простом виде можно как-то так реализовать:
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
#include <vector>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
typedef vector<int> adjacent_t;
typedef vector<adjacent_t> graph_t;
 
void read_graph(const char * fname, graph_t & g)
{
    ifstream inp(fname);
    int n, m;
    inp >> n >> m;
    g.clear();
    g.resize(n);
    for (int i = 0; i < m; ++i) {
        int from, to;
        inp >> from >> to;
        g[from].push_back(to);
    }
}
 
void write_dot(const char * fname, const graph_t & g)
{
    ofstream out(fname);
    out << "digraph {\n";
    for (size_t i = 0; i < g.size(); ++i) {
        out << "  " << i << ";\n";
    }
    for (size_t v = 0; v < g.size(); ++v) {
        for (auto u : g[v]) {
            out << "  " << v << " -> " << u << ";\n";
        }
    }
    out << "}\n";
}
 
int main()
{
    graph_t g;
    read_graph("input.txt", g);
    write_dot("g.dot", g);
    system("dot g.dot -Tpng -og.png");
}
У меня что-то не получается передать файл в Grafiz, создается .dot файл, а что потом? куда и как его пихать?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.05.2013, 22:40
В утилиту передавать параметром ...
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
18.05.2013, 21:04  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 FILE * fo;
   fo = fopen("g.dot","wt");
   fprintf( fo, "digraph Graf {\n");
  
    for (j=1; j<8; j++)
 
        for (i=1; i<8; i++)
 
            if (StringGrid3->Cells[i][j]==1)
            {
             fprintf( fo, " A%d", i);
             fprintf( fo, "->");
             fprintf( fo, "B%d \n", j);
            }
 
 
        fprintf( fo, "}");
     fclose(fo);
g.dot получает следующее:

digraph Graf {
A1->B1
A2->B1
A2->B2
A3->B2
A3->B3
A4->B3
A5->B4
A6->B5
A6->B6
A7->B7
}

Однако матрица инцидентности такая:
В1 В2 В3 В4 В5 В6 В7
А1 1 1 0 0 0 0 0
А2 0 1 1 0 0 0 0
А3 0 0 1 1 0 0 0
А4 0 0 0 0 1 0 0
А5 0 0 0 0 0 1 0
А6 0 0 0 0 0 1 0
А7 0 0 0 0 0 0 1

Где я впорол чушь, что наполняется неверными параметрами? Как это должно правильно выглядеть?
0
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
21.05.2013, 21:27  [ТС]
Ребята нужен ответ! Не бросайте на произвол судьбы!))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2013, 21:27
Помогаю со студенческими работами здесь

Код для Graphviz
Не знаю, куда написать: Написать в системе Graphviz код, для получения такой же таблицы:

Как использовать Graphviz?
Помогите использовать graphviz в Embarcadero xe5 c++. Я новичок. Программа считает по определённому алгоритму, полученные данные необходимо...

Graphviz - импорт графов в SVG
Использую Graphviz для Windows и все хорошо, но не могу получить png или svg файл. Как экспортировать файл?

Чтение графа из XML файла и визуализация в Graphviz
Добрый день, мне нужно сделать 1. чтение графа, описанного в xml файле в какую-нибудь внутреннюю форму 2 сделать визуализацию этой...

Graphviz. Ошибка "dot: can't open dot"
Здравствуйте. Пытаюсь разобраться с Graphviz для визуализации графа, в интернете был найден такой код: using System; using...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru