fork download
  1. program grdeg
  2.  
  3. integer, allocatable :: A(:,:), B(:,:), ecc(:)
  4.  
  5. read(*, *) n
  6. allocate(A(n,n), B(n,n), ecc(n))
  7.  
  8. call rdmat(A, n)
  9. call connect(A, n, B)
  10. ecc = maxval(B, 1)
  11. irad = minval(ecc, ecc > 0)
  12. idia = maxval(ecc)
  13.  
  14. print*, 'radius: ', irad
  15. print*, 'diameter: ', idia
  16.  
  17. contains
  18. subroutine prmat(A, n, d)
  19. character(len=40) :: fmt
  20. integer, intent(in) :: n, d
  21. integer, intent(inout) :: A(n,n)
  22. write(fmt, '(A,I0,A,I0,A)') '(', n, '(I', d, ':,X))'
  23. write(*, fmt) ((A(j,i), j=1,n) ,i=1,n)
  24. end subroutine
  25.  
  26. subroutine rdmat(A, n)
  27. integer, intent(inout) :: A(n,n)
  28. A = 0
  29. do
  30. read(*,*, end=1) i,j
  31. A(i,j) = A(i,j)+1
  32. A(j,i) = A(j,i)+1
  33. end do
  34. 1 continue
  35. end subroutine
  36.  
  37. subroutine connect(A, n, B)
  38. integer, intent(in) :: A(n,n)
  39. integer, intent(out):: B(n,n)
  40. integer:: C(n,n)
  41. B = 0
  42. C = A
  43.  
  44. do i=1,n
  45. where (B == 0 .and. C > 0) B = i
  46. C = MATMUL(A,C)
  47. end do
  48. do i=1,n
  49. B(i,i) = 0
  50. end do
  51. end subroutine
  52.  
  53.  
  54. end program
  55.  
Success #stdin #stdout 0s 3928KB
stdin
3
1 2
1 3
2 1
stdout
 radius:            1
 diameter:            2