program cicloGrafo integer,parameter :: N = 5 integer,dimension(3,N) :: grafo integer :: vertice,siguienteVertice integer :: conectado,ciclo,verticeRecorridos !//// instancio las vars. grafo(1,1:N) = (/1,2,3,4,5/) grafo(2,1:N) = (/2,3,4,1,0/) grafo(3,1:N) = (/0,0,5,0,0/) ciclo = 0 !//// mientras sea cero no encontre un ciclo, si es 1 si conectado = 0 vertice = 1 !//// primer vertice, busco ciclo de este vertice !//// busco el vertice 1 en la matriz (filas 2 y 3) y obtengo el que lo conecta siguienteVertice = encontrarVerticePadre(vertice) write(*,'(A,I1,$)'),"el vertice:",vertice print*, "se conecta por:",siguienteVertice !//// mientras no encuentre un ciclo y encuentre el padre de un vertice (o sea el qu lo conecta) repito el proc. verticesRecorridos = 1 do while ((ciclo == 0).and.(siguienteVertice /=0).and.(verticesRecorridos <= 5)) if (siguienteVertice == 1) then !//// si es 1 entonces encontre un padre ciclo = 1 !//// (fila 1 y en este caso columna 1) y por lo tanto un ciclo else write(*,'(A,I1,$)'),"el vertice:",siguienteVertice siguienteVertice = encontrarVerticePadre(siguienteVertice) !//// busco el padre del padre hayado print*,"se conecta por:",siguienteVertice verticesRecorridos = verticesRecorridos + 1 end if end do if (ciclo == 1) then print*, "encontre un ciclo !!" else print *, "no hay ciclo" end if !---------------------------------------------------------- contains integer function encontrarVerticePadre(vertice) integer,intent(in) :: vertice integer :: fila,columna !//////////////////////////////////////////// !/ puedo reocrrer con: / !/ do j = 1,N / !/ do i = 2,3 / !/ ...... / !/ pero si encuentro el vertice sigue, esta / !/ bien pero es menos eficiente / !//////////////////////////////////////////// columna = 1 encontrarVerticePadre = 0 do while ((encontrarVerticePadre == 0).and.(columna <= N)) fila = 2 do while ((encontrarVerticePadre == 0).and.(fila <= 3)) if (grafo(fila,columna) == vertice) then encontrarVerticePadre = grafo(1,columna) end if fila = fila + 1 end do columna = columna + 1 end do end function encontrarVerticePadre end program cicloGrafo