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

GraphViz

12.05.2013, 00:16. Показов 16397. Ответов 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru