Идея. Запустим метод волны (или обход в ширину) из некоторой вершины. Он посчитает расстояния до всех вершин компоненты связности, при этом у вершин из других компонент связности останутся -1. Найдем вершину, в которой осталась -1 и запустим метод волны из нее (при этом не заполняя массив B значением -1). Теперь -1 остались только в тех вершинах, которые не лежат в первых двух нами найденных компонентах связности. И так далее. Сколько раз мы запускали метод волны - столько у нас компонент связности.
Алгоритм решения задачи (пусть A - матрица смежности, B - массив расстояний до соответствующей вершины, использующийся в методе волны, D - переменная, использующаяся для подсчета числа компонент связности):
D:=0; Заполняем массив B значением -1. Пробегаем все вершины (Z - текущая вершина) Если B[Z] = -1 тогда D:=D+1 (найдена еще одна компонента связности), B[Z]:=0; запускаем метод волны, который найдет расстояния до всех вершин, до которых сможет дойти от вершины Z D - ответ задачи
Для работы вам нужна матрица смежности, а дан список ребер. Естественно, нужно считать этот список ребер, а в памяти построить матрицу смежности. Не забудьте, что, например, ребро 2 3 - это ребро как из 2 в 3, так и из 3 в 2.
Что делать с кратными ребрами и петлями? Мысль: нам все равно, есть петля или нет, есть ли между какими-то вершинами несколько ребер или одно.