Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Граф/c++

Featured Replies

Здравейте , ако някои може да помогне  ще бъда много благодарен!

Да се напише функция, която брои и визуализира върхове с повече от 2 изходящи дъги без значение дали има входящи дъги в дадения граф и се добави към менюто.

 

 

#include <iostream>
using namespace std;
const int n = 15;
struct link { char key; link *next; } *gr[n];


void init(link *gr[n]);
int search_node(link *gr[n], char c);
int search_arc(link *gr[5], char c1, char c2);
void add_node(link *gr[n], char c);
void add_arc(link *gr[n], char c1, char c2);
void del_node(link *gr[n], char c);
void del_arc(link *gr[n], char c1, char c2);
void list_node(link *gr[n]);

 


void init(link *gr[n])
{
for (int i = 0; i < n; i++)
gr[i] = NULL;
}
int search_node(link *gr[n], char c)
{
int flag = 0;
for (int i = 0; i < n; i++)
if (gr[i])
if (gr[i]->key == c)
{
flag = 1;
break;
}
return flag;
}
int search_arc(link *gr[5], char c1, char c2)
{
int flag = 0;
if (search_node(gr, c1) && search_node(gr, c2))
{
int i = 0;
while (gr[i]->key != c1) i++;
link *p = gr[i];
while (p->key != c2 && p->next != NULL)
p = p->next;
if (p->key == c2)
flag = 1;
}
return flag;
}
void add_node(link *gr[n], char c)
{
if (search_node(gr, c))
cout << "\nExisting node!\n";
else
{
int j = 0;
while (gr[j] && (j < n))
j++;
if (gr[j] == NULL)
{
gr[j] = new link;
gr[j]->key = c;
gr[j]->next = NULL;
}
else
cout << "\nOverflow!\n";
}
}
void add_arc(link *gr[n], char c1, char c2)


{
int i = 0;
link *p;
if (search_arc(gr, c1, c2))
{
cout << "\nExisting arc!";
}
else
{
if (!(search_node(gr, c1)))
add_node(gr, c1);
if (!(search_node(gr, c2)))
add_node(gr, c2);
while (gr[i]->key != c1)
i++;
p = new link;
p->key = c2;
p->next = gr[i]->next;
gr[i]->next = p;
}
}
void del_node(link *gr[n], char c)
{
if (search_node(gr, c))
{
int i = 0;
while (gr[i]->key != c)
i++;
link *p, *q = NULL;
while (gr[i] != NULL)
{
p = gr[i];
gr[i] = p->next;
delete p;
}
for (i = 0; i < n; i++)
if (gr[i])
{
p = gr[i];
while ((p->key != c) && (p->next != NULL))
{
q = p;
p = p->next;
}
if (p->key == c)
{
q->next = p->next;
delete p;
}
}
}
else
cout << "The node is not in the graph!";
}
void del_arc(link *gr[n], char c1, char c2)
{
if (search_arc(gr, c1, c2))
{
int i = 0;
while (gr[i]->key != c1)
i++;
link *p = gr[i], *q = NULL;
while (p->key != c2)


{
q = p;
p = p->next;
}
q->next = p->next;
delete p;
}
else
cout << "\nThe arc is not in the graph!";
}
void list_node(link *gr[n])
{
cout << "\n";
for (int i = 0; i < n; i++)
if (gr[i])
cout << gr[i]->key;
}


    
        int main()
{
setlocale(LC_ALL, "bg");
char c, k;
int m;
do
{
cout << "\n\n Main menu\n\n";
cout << "1 - Init\n";
cout << "2 - Add node\n";
cout << "3 - Add arc\n";
cout << "4 - Delete Node\n";
cout << "5 - Delete Arc\n";
cout << "6 - Search Node\n";
cout << "7 - Search Arc\n";
cout << "8 - Print All\n";
cout << "9 - End";
cout << "\n\nEnter (1-9):";
cin >> m;
switch (m)
{
case 1:
{
init(gr); break;
}
case (2):
{
cout << "\nEnter node (char): ";
cin >> c;
add_node(gr, c);
break;
}
case (3):
{
cout << "\nEnter first node (char) :";
cin >> c;
cout << "\nEnter second node (char):";
cin >> k;
add_arc(gr, c, k);
break;
}


case (4):
{
cout << "\nEnter node (char):";
cin >> c;
del_node(gr, c);
break;
}
case (5):
{
cout << "\nEnter first node (char):";
cin >> c;
cout << "\nEnter second node (char):";
cin >> k;
del_arc(gr, c, k);
break;
}
case (6):
{
cout << "\nEnter node (char): ";
cin >> k;
if (search_node(gr, k))
cout << "\nSearch result: OK!";
else
cout << "\nSearch result: NO!";
break;
}
case (7):
{
cout << "\nEnter first node (char):";
cin >> c;
cout << "\nEnter second node (char):";
cin >> k;
if (search_arc(gr, c, k))
cout << "\nSearch result: OK!";
else
cout << "\nSearch result: NO!";
break;
}
case (8):
{
list_node(gr); break;

    }

}
} while (m != 9);
cout << "\n";
        }
       

  • Автор
преди 5 минути, Raze написа:

Нали си я написал или това е да се похвалиш? Защо не ползваш бутона за код?

Това е графът, но тази функция: Да се напише функция, която брои и визуализира върхове с повече от 2 изходящи дъги без значение дали има входящи дъги в дадения граф и се добави към менюто.

Не се сещам как да се направи , ако имаш идея моля сподели! Благодаря!

  • Автор
преди 13 минути, piх3l написа:

Как да стане, като не позволяваш повече от една дъга?

Може ли да ме опътите как да направя тази функция?

Да се напише функция, която брои и визуализира върхове с повече от 2 изходящи дъги без значение дали има входящи дъги в дадения граф и се добави към менюто.

  • Автор
преди 5 минути, piх3l написа:

Може - link трябва да пази върха и масив от върховете, към които сочи.

Много благодаря, но това трябва да бъде като отделна функция нали? Ако е възможно ще напишите ли ваш варианта на функцията , която трябва да добавя?

Ти пак си направи функция, ама трябва да си преправиш и структурата, понеже в момента е просто един свързан списък. Като искаш граф, направи си един мап, който да държи връх и списък с върховете, към които сочи. Map<Vertex, List<Vertex>>

След това, задачата ти се свежда до това, да провериш колко е голям списъка с върхове на определен връх.

  • Автор
преди 17 минути, piх3l написа:

Ти пак си направи функция, ама трябва да си преправиш и структурата, понеже в момента е просто един свързан списък. Като искаш граф, направи си един мап, който да държи връх и списък с върховете, към които сочи. Map<Vertex, List<Vertex>>

След това, задачата ти се свежда до това, да провериш колко е голям списъка с върхове на определен връх.

Благодаря, но такива неща още не са ми препотавани и незнам как да ги направя

Нали са ти дали задача с графи... би трябвало да са ти показали как се създава граф. Трябва, по някакъв начин, да асоциираш всеки връх със списък, в който да държиш върховете, към които сочи.

Примерно

#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

int main()
{
    // This is our graph
    map<string, vector<string>> graph;
    
    // Add a few vetices
    graph.insert({"vertex1", vector<string>()});
    graph.insert({"vertex2", vector<string>()});
    graph.insert({"vertex3", vector<string>()});
    graph.insert({"vertex4", vector<string>()});
    
    // Get vertex1's vertices container
    vector<string> &vertex1 = graph.at("vertex1");
    
    // Create an arc from vertex1 to vertex2
    vertex1.push_back("vertex2");
    
    // Create an arc from vertex1 to vertex4
    vertex1.push_back("vertex4");
    
    // Loop through the vertices
    for (map<string, vector<string>>::iterator it = graph.begin(); it != graph.end(); it++) {
        
        // There is a container associated with each vertex, let's see its content
        for (string vertex : it->second) {
            cout << it->first << " -> " << vertex << endl;
        }
    }

    return EXIT_SUCCESS;
}

 

  • Автор
преди 3 часа, piх3l написа:

Нали са ти дали задача с графи... би трябвало да са ти показали как се създава граф. Трябва, по някакъв начин, да асоциираш всеки връх със списък, в който да държиш върховете, към които сочи.

Примерно

#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

int main()
{
    // This is our graph
    map<string, vector<string>> graph;
    
    // Add a few vetices
    graph.insert({"vertex1", vector<string>()});
    graph.insert({"vertex2", vector<string>()});
    graph.insert({"vertex3", vector<string>()});
    graph.insert({"vertex4", vector<string>()});
    
    // Get vertex1's vertices container
    vector<string> &vertex1 = graph.at("vertex1");
    
    // Create an arc from vertex1 to vertex2
    vertex1.push_back("vertex2");
    
    // Create an arc from vertex1 to vertex4
    vertex1.push_back("vertex4");
    
    // Loop through the vertices
    for (map<string, vector<string>>::iterator it = graph.begin(); it != graph.end(); it++) {
        
        // There is a container associated with each vertex, let's see its content
        for (string vertex : it->second) {
            cout << it->first << " -> " << vertex << endl;
        }
    }

    return EXIT_SUCCESS;
}

 

Много благодаря!

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Публикацията ви съдържа термини, които не допускаме! Моля, редактирайте съдържанието си и премахнете подчертаните думи по-долу. Ако замените букви от думата със звездички или друго, за да заобиколите това предупреждение, профилът ви ще бъде блокиран и наказан!
Напишете отговор в тази тема...

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.