fork download
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. )
  8.  
  9. const INF = int(1e9)
  10.  
  11. func main() {
  12. in := bufio.NewReader(os.Stdin)
  13.  
  14. var n, m int
  15. if _, err := fmt.Fscan(in, &n, &m); err != nil {
  16. // вообще нет входа
  17. fmt.Print(-1)
  18. return
  19. }
  20.  
  21. g := make([][]int, n)
  22.  
  23. // Читаем ДО m рёбер, но если ввод закончился — не зависаем
  24. for i := 0; i < m; i++ {
  25. var a, b int
  26. if _, err := fmt.Fscan(in, &a, &b); err != nil {
  27. break // EOF или другой конец ввода
  28. }
  29. a--
  30. b--
  31. if a >= 0 && a < n && b >= 0 && b < n && a != b {
  32. g[a] = append(g[a], b)
  33. g[b] = append(g[b], a)
  34. }
  35. }
  36.  
  37. best := INF
  38.  
  39. dist := make([]int, n)
  40. parent := make([]int, n)
  41. q := make([]int, n)
  42.  
  43. for s := 0; s < n; s++ {
  44. for i := 0; i < n; i++ {
  45. dist[i] = -1
  46. parent[i] = -1
  47. }
  48.  
  49. head, tail := 0, 0
  50. dist[s] = 0
  51. q[tail] = s
  52. tail++
  53.  
  54. for head < tail {
  55. v := q[head]
  56. head++
  57.  
  58. if dist[v]*2+1 >= best {
  59. continue
  60. }
  61.  
  62. for _, to := range g[v] {
  63. if dist[to] == -1 {
  64. dist[to] = dist[v] + 1
  65. parent[to] = v
  66. q[tail] = to
  67. tail++
  68. } else if parent[v] != to {
  69. cycleLen := dist[v] + dist[to] + 1
  70. if cycleLen < best {
  71. best = cycleLen
  72. }
  73. }
  74. }
  75. }
  76. }
  77.  
  78. if best == INF {
  79. fmt.Print(-1)
  80. } else {
  81. fmt.Print(best)
  82. }
  83. }
  84.  
  85.  
  86.  
  87.  
Success #stdin #stdout 0s 5320KB
stdin
6 7
1 6
6 4
4 2
2 5
5 6
2 3
3 5
stdout
3