Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Alex_94
3 / 3 / 1
Регистрация: 21.03.2013
Сообщений: 17
#1

Найти мосты графа - C++

10.07.2013, 22:26. Просмотров 487. Ответов 0
Метки нет (Все метки)

Помогите, пожалуйста. В чем ошибка?
http://www.e-olimp.com.ua/problems/1943 - условие
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
#include <stdio.h>
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
#pragma comment(linker, "/STACK:20000000");
 typedef vector<int> VInt;
 typedef vector<VInt> VVInt;
 typedef VInt::iterator VIter;
 typedef pair<int, int> PInt;
 typedef vector<PInt> VPInt;
 typedef vector<VPInt> VVPInt;
 typedef VPInt::iterator VPIter;
 
 VVInt graph;
 VInt colors, parents, enter, leave, low, bcc;
int myTime = 0;
int newIndex = 0;
 set <int> res;
 set<int>::iterator iter;
 
void visitLow(int u) {
   colors[u] = 1;
   low[u] = enter[u] = ++myTime;
   
   for(VIter it = graph[u].begin(); it != graph[u].end(); it++)
      if(colors[*it] == 0) {
         parents[*it] = u;
         visitLow(*it);
         low[u] = min(low[u], low[*it]);
      } else if(colors[*it] == 1 && *it != parents[u]) {
         low[u] = min(low[u], enter[*it]);
      }
   
   colors[u] = 2;
   leave[u] = ++myTime;      
 }
 
void visitBCC(int u) {
   for(VIter it = graph[u].begin(); it != graph[u].end(); it++)
      if(parents[*it] == u) {
         bcc[*it] = (low[*it] < enter[u]) ? bcc[u] :         
                    (low[*it] > enter[u]) ? -1 :             
                    (newIndex++);                            
         visitBCC(*it);         
      }
 }
 
int getBCC(int u, int v) {
    return bcc[(enter[u] > enter[v]) ? u : v];
 }
 
int main() {
   int n, m, i;
 
   scanf("%d%d", &n, &m);
   graph.resize(n);
   while(m--) {
      int from, to;
      scanf("%d%d", &from, &to);
      graph[from - 1].push_back(to - 1);
      graph[to - 1].push_back(from - 1);
   }
 
   colors.assign(n, 0);
   parents.assign(n, -1);
   enter.resize(n);
   leave.resize(n);
   low.resize(n);
   for(i = 0; i < n; i++)
      if(colors[i] == 0)
         visitLow(i);
 
   bcc.assign(n, -1);
   for(i = 0; i < n; i++)
      if(parents[i] == -1)
         visitBCC(i);   
   
 
   VPInt bridges;
   VVPInt comps(newIndex);
   for(i = 0; i < n; i++)
      for(VIter it = graph[i].begin(); it != graph[i].end(); it++)
         if(i < *it) {  
            int id = getBCC(i, *it);
           
            if(id == -1)  {bridges.push_back(PInt(i, *it));
            res.insert(*it);
            }
            else {comps[id].push_back(PInt(i, *it));
             }
         }
 
   printf("%d\n",bridges.size());
   
   printf("%d\n",*res.begin());
    for (iter=res.begin(); iter!=res.end(); )
    {
        iter++;
        if(iter!=res.end())
        printf("%d\n",*iter);
    }
    //printf("\n");
 
   
    return 0; 
 }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2013, 22:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти мосты графа (C++):

Компоненты связности, мосты, точки сочленения - C++
Всем привет! Какими способами можно решить эту задачу? Дано прямоугольное черно-белое изображение размера N x M, которое содержит только...

заданно матрицу смежности простого графа. Построить каркас этого графа с использованием поиска вширь - C++
Задание: заданно матрицу смежности простого графа. Построить каркас этого графа с использованием поиска вширь. Помогите написать...

Найти диаметр графа - C++
помогите найти диаметр графа, в ответ записать, номера двух вершин и длина пути между ними. вот что у меня есть на данный момент ...

Найти квадрат ориентированного графа - C++
Здравствуйте , помогите, пожалуйста решить задачу по графам: 1.Дан ориентированный граф. Найти квадрат ориентированного графа

Найти связные компоненты графа - C++
Здравствуйте, уже 2 ой день ломаю голову над этой элементарной задачей. Прошу Вас помочь разобраться, Вот мои наработки. Работает не...

Найти минимальное расстояние между вершинами 1 и N графа - C++
Dev-C++ не компилирует программу Решил написать алгоритм 0,1-BFS void BFS(int** MasList, int** MasListW, int&amp; N,int&amp; S){ int*...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2013, 22:26
Привет! Вот еще темы с ответами:

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

Найти степени входа и выхода каждой вершины графа. - C++
Задано множество упорядоченных пар вершин, соответствующих дугам ориентированного графа. Найти степени входа и выхода каждой вершины. ...

Найти количество всех путей и контуров графа длиной S - C++
Требуется найти количество всех путей и контуров графа длиной 7. Граф: 1 0 0 1 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 1 1...

Найти кратчайшие пути между двумя заданными точками графа - C++
Добрый вечер. Кто сможет написать программу для задачи, буду очень признателен 4) Найти кратчайшие пути из точки D1 в точку D8 Вот...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru