Дан неориентированный
невзвешенный граф, в котором выделена вершина. Вам необходимо найти количество
вершин, лежащих с ней в одной компоненте связности (включая саму вершину).
Вход. В первой строке содержится количество вершин графа n и выделенная вершина s (1 ≤ s ≤ n ≤ 100). В следующих n строках записано по n чисел – матрица смежности графа, в котрой цифра "0" означает отсутствие ребра
между вершинами, а цифра "1" – его наличие. Гарантируется, что на главной
диагонали матрицы всегда стоят нули.
Выход.
Выведите искомое количество вершин.
Пример входа |
Пример выхода |
5 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 |
3 |
поиск в
глубину
Запускаем поиск
в глубину из заданной вершины s. В счетчике
(глобальной переменной) подсчитываем количество вершин, по которым пройдет
поиск в глубину.
Граф,
приведенный в примере, имеет вид:
Вершина номер 1
лежит в компоненте связности размера 3.
Объявим матрицу
смежности и массив used использованных
вершин.
#define MAX 102
int g[MAX][MAX], used[MAX];
Поиск в глубину из вершины v. В переменной cnt подсчитываем количество пройденных вершин.
void dfs(int v)
{
used[v] = 1;
cnt++;
for (int i = 1; i <= n; i++)
if (g[v][i] && !used[i]) dfs(i);
}
Основная часть программы. Читаем входные
данные – матрицу смежности и стартовую вершину s.
scanf("%d %d", &n, &s);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
scanf("%d", &g[i][j]);
Запускаем поиск в глубину из
вершины s.
memset(used, 0, sizeof(used));
cnt = 0;
dfs(s);
Выводим количество вершин, лежащих
вместе с s в одной компоненте связности.
printf("%d\n", cnt);