Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
2 / 2 / 2
Регистрация: 16.03.2015
Сообщений: 48
1

Решение задачи китайского почтальона

25.04.2017, 20:03. Показов 6156. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я написала программу, но до конца не уверена, что она работает правильно. Буду признательна, если напишите замечания.

Если граф имеет эйлерову-цепь (или эйлеров-путь), то в этом случае, эйлерова-цепь (или путь) проходит по каждому ребру, и таким образом, решением будет являться выбор любой эйлеровой-цепи (или пути).

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
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
152
153
154
155
156
157
158
159
160
161
162
163
#include <iostream>
#include <list>
#include <vector>
#include <locale>
#include <algorithm>
#include <cstdio>
#define CHARS 26
#define inf 1000000000
using namespace std;
 
class Graph
{
    int V;
    list<int> *adj;
    int *in;
public:
    Graph(int V);
    ~Graph()   { delete[] adj; delete[] in; }
    void addEdge(int v, int w) { adj[v].push_back(w);  (in[w])++; }
    bool isEulerianCycle();
    bool isSC();
    void DFSUtil(int v, vector<bool> &visited);
    void getTranspose(Graph &g);
    Graph(const Graph &a){
        V = a.V;
        adj = new list<int>[V];
        in = new int[V];
        for (int v = 0; v < V; v++){
            for (list<int>::iterator it = a.adj[v].begin(); it != a.adj[v].end(); it++)
                adj[v].push_back(*it);
        }
 
        for (int i = 0; i < V; i++)
            in[i] = a.in[i];
    }
};
Graph::Graph(int V)
{
    this->V = V;
    adj = new list<int>[V];
    in = new int[V];
    for (int i = 0; i < V; i++)
        in[i] = 0;
}
bool Graph::isEulerianCycle()
{
    if (isSC() == false)
        return false;
    for (int i = 0; i < V; i++)
        if (adj[i].size() != in[i])
            return false;
    return true;
}
void Graph::DFSUtil(int v, vector<bool> &visited)
{
    visited[v] = true;
 
 
    list<int>::iterator i;
    for (i = adj[v].begin(); i != adj[v].end(); ++i)
        if (!visited[*i])
            DFSUtil(*i, visited);
}
void Graph::getTranspose(Graph &g)
{
    for (int v = 0; v < V; v++)
    {
        list<int>::iterator i;
        for (i = adj[v].begin(); i != adj[v].end(); ++i)
        {
            g.adj[*i].push_back(v);
            (g.in[v])++;
        }
    }
}
bool Graph::isSC()
{
    vector<bool> visited(V, false);
    int n;
    for (n = 0; n < V; n++)
        if (adj[n].size() > 0)
            break;
    if (n >= V)
        return true;
    DFSUtil(n, visited);
    for (int i = 0; i < V; i++)
        if (adj[i].size() > 0 && visited[i] == false)
            return false;
    Graph gr(V);
    getTranspose(gr);
    for (int i = 0; i < V; i++)
        visited[i] = false;
    gr.DFSUtil(n, visited);
    for (int i = 0; i < V; i++)
        if (adj[i].size() > 0 && visited[i] == false)
            return false;
    return true;
}
int main()
{
    setlocale(LC_ALL, "RUSSIAN");
    int n, m;
    cout << "введите количество вершин и количество ребер: \n";
    cin >> n >> m;
    int graph[15][15], edgenum[15] = {};
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            graph[i][j] = inf;
        }
    }
    Graph g(n);
    int weightsum = 0;
    cout << "введите начало, конец ребра и вес: \n";
    for (int i = 0; i < m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        g.addEdge(a, b);
        graph[a][b] = min(graph[a][b], c);
        graph[b][a] = min(graph[b][a], c);
        weightsum += c;
        edgenum[a]++;
        edgenum[b]++;
    }
    if (g.isEulerianCycle()){
        cout << "граф является эйлеровым \n";
        vector<int> oddnode;
        for (int i = 0; i < n; i++){
            if (edgenum[i] % 2 == 1) oddnode.push_back(i);
        }
        int oddnum = oddnode.size();
        for (int k = 0; k < n; k++){
            for (int i = 0; i < n; i++){
                for (int j = 0; j < n; j++){
                    graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
                }
            }
        }
        int result[1 << 15] = {};
        for (int i = 0; i < oddnum; i++){
            result[(1 << i)] = -1;
        }
        for (int i = 0; i < (1 << oddnum); i++){
            if (result[i] == -1) continue;
            for (int j = 0; j < oddnum; j++){
                for (int k = j + 1; k < oddnum; k++){
                    if ((i & (1 << j)) != 0 || (i & ((1 << k))) != 0) continue;
                    int news = oddnode[j], newt = oddnode[k];
                    int tmp = (i | (1 << j) | (1 << k));
                    if (graph[news][newt] != inf && tmp != i){
                        if (result[tmp] == 0) result[tmp] = result[i] + graph[news][newt];
                        else result[tmp] = min(result[tmp], result[i] + graph[news][newt]);
                    }
                }
            }
        }
        cout << "кратчайший путь: ";
        cout << weightsum + result[(1 << oddnum) - 1] << endl;
    }
    else
        cout << "граф не является эйлеровым \n";
    system("pause");
    return 0;
}
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2017, 20:03
Ответы с готовыми решениями:

Задача китайского почтальона
Ребят, помогите написать алгоритм китайского почтальона поиска кратчайших путей в графе,...

Оптимальный маршрут почтальона
Найти оптимальный маршрут почтальона на ориентированном графе, который задается количеством вершин,...

задачи с двумерным массивом, решение должно быть похоже на решение 8-ми классника
Без рандома, все вводится с клавиатуры, без Inc, без Break и т.д. 1)Сколько учеников не имеет в...

Найти решение уравнения, изоклинную и интегральную кривые, решение задачи Коши
Помогите пожалуйста! а) Найти решение вида: x=a,y=b,y=kx+b y'=\frac{y^2-4}{xy},\\ y'=x-y+2 б)...

4
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
25.04.2017, 20:30 2
theseventhline, молодец - держи нас в курсе!
0
2 / 2 / 2
Регистрация: 16.03.2015
Сообщений: 48
25.04.2017, 21:01  [ТС] 3
помощи не ждать?

Добавлено через 15 минут
rikimaru2013, это сарказм?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
25.04.2017, 21:20 4
theseventhline, ваша тема больше похожа на хвастовство. Задача настолько глупого предметно-ориентированна, что её нет смысла даже выносить на обсуждение среди программистов. Почитайте другие темы в этом разделе - везде ищут ответы на конкретно поставленные вопросы, а тут "если что - пишите" )
0
2 / 2 / 2
Регистрация: 16.03.2015
Сообщений: 48
25.04.2017, 21:24  [ТС] 5
rikimaru2013, какое уж тут хвастовство, просто я недавно писала один алгоритм, но мне никто не помог, Вы знаете, как мне помочь? Как сделать проверку для каждого цикла? Это проблема в данной программе
0
25.04.2017, 21:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2017, 21:24
Помогаю со студенческими работами здесь

Аналитическое решение решение краевой задачи для ОДУ второго порядка
Здравствуйте! Задача: Аналитически найти частное решение ОДУ. Изначально в частных производных, но...

Найдите общее решение и решение задачи Коши для ОДУ
Найдите общее решение и решение задачи Коши для ОДУ (с разделяющимися переменными, с однородной...

Найти общее решение или решение задачи Коши
вот пример:

Задача почтальона для смешанного графа
Ребят, помогите, кто может. Нужна задача почтальона для смешанного графа на C++.

Решение задачи
Почему подчеркивает R пишет, что функция не определена В институте проводится конкурс на лучшую...

Решение задачи
Как решить задачу: поменять местами второй четный со вторым нечетным в одномерном массиве


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru