Я вижу две существенные проблемы только в коде, который инициализирует массив данных.Во-первых, такой цикл
for (int i=0;i<=V;i++)
зацикливает на еще один элемент, чем фактически существует в массиве.Правильная форма цикла, если длина массива V элементов равна
for (int i=0;i<V;i++)
Это "меньше чем", а не "меньше или равно".
Во-вторых, вы выделяете оба массивауказатели должны быть длиной V указателей, а отдельные столбцы также иметь длину V элементов;но позже вы используете тот же массив и ожидаете, что он будет иметь размер V x E.Таким образом, в целом, я думаю, что код распределения должен быть
int** adj = new int*[V];
for (int i=0;i<V;i++)
{
adj[i]= new int[E];
}
В других местах могут быть и другие ошибки, но, по крайней мере, я вас начал.