Advertisement
Guest User

Untitled

a guest
Apr 10th, 2022
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. use std::io::BufRead;
  2.  
  3. #[derive(Default)]
  4. struct Vertex {
  5. first_edge: usize,
  6. first_reverse_edge: usize,
  7. max_distance: Option<i64>,
  8. }
  9.  
  10. #[derive(Default)]
  11. struct Edge {
  12. start: usize,
  13. end: usize,
  14. next: usize,
  15. next_reverse: usize,
  16. weight: i64,
  17. useful: bool,
  18. }
  19.  
  20. struct Searcher {
  21. n: usize,
  22. vertices: Vec<Vertex>,
  23. edges: Vec<Edge>,
  24. visited: Vec<Option<i64>>,
  25. high_score: i64,
  26. }
  27.  
  28. impl Searcher {
  29.  
  30. // marks all edges that can reach node N?
  31. fn mark_useful_edges(&mut self, visited: &mut [bool], i: usize) {
  32. visited[i] = true;
  33. let mut k = self.vertices[i].first_reverse_edge;
  34. while k != 0 {
  35. self.edges[k].useful = true;
  36. let j = self.edges[k].start;
  37. if !visited[j] {
  38. self.mark_useful_edges(visited, j);
  39. }
  40. k = self.edges[k].next_reverse;
  41. }
  42. }
  43.  
  44. fn search(&mut self, i: usize, w: i64) -> Result<i64, ()> {
  45. let mut d = std::i64::MIN;
  46. if i == self.n {
  47. if self.high_score < w {
  48. self.high_score = w;
  49. }
  50. d = 0;
  51. }
  52. let mut k = self.vertices[i].first_edge;
  53. while k != 0 {
  54. if self.edges[k].useful {
  55. let j = self.edges[k].end;
  56. let w1 = self.edges[k].weight;
  57. if let Some(w2) = self.visited[j] {
  58. if w2 < w + w1 {
  59. return Err(());
  60. }
  61. } else {
  62. self.visited[j] = Some(w + w1);
  63. let d1 = if let Some(d1) = self.vertices[j].max_distance {
  64. d1
  65. } else {
  66. self.search(j, w + w1)?
  67. };
  68. if d1 != std::i64::MIN {
  69. d = d.max(w1 + d1);
  70. }
  71. self.visited[j] = None;
  72. }
  73. }
  74. k = self.edges[k].next;
  75. }
  76. self.vertices[i].max_distance = Some(d);
  77. Ok(d)
  78. }
  79. }
  80.  
  81. fn main() {
  82. let stdin = std::io::stdin();
  83. let mut stdin = stdin.lock();
  84. let mut input = String::with_capacity(32);
  85. stdin.read_line(&mut input).unwrap();
  86. let mut i = input.trim_end().split(' ');
  87. let n: usize = i.next().unwrap().parse().unwrap();
  88. let m: usize = i.next().unwrap().parse().unwrap();
  89.  
  90. let mut v = Vec::new();
  91. v.resize_with(n + 1, Vertex::default);
  92. let mut e = Vec::with_capacity(m + 1);
  93. e.push(Edge::default());
  94.  
  95. for k in 1..=m {
  96. input.clear();
  97. stdin.read_line(&mut input).unwrap();
  98. let mut i = input.trim_end().split(' ');
  99. let a: usize = i.next().unwrap().parse().unwrap();
  100. let b: usize = i.next().unwrap().parse().unwrap();
  101. let w: i64 = i.next().unwrap().parse().unwrap();
  102. e.push(Edge {
  103. start: a,
  104. end: b,
  105. next: v[a].first_edge,
  106. next_reverse: v[b].first_reverse_edge,
  107. weight: w,
  108. useful: false,
  109. });
  110. v[a].first_edge = k;
  111. v[b].first_reverse_edge = k;
  112. }
  113.  
  114. let mut visited = Vec::new();
  115. visited.resize(n + 1, None);
  116. visited[1] = Some(0);
  117. let mut searcher = Searcher {
  118. n,
  119. vertices: v,
  120. edges: e,
  121. visited,
  122. high_score: std::i64::MIN,
  123. };
  124. {
  125. let mut visited = Vec::new();
  126. visited.resize(n + 1, false);
  127. searcher.mark_useful_edges(&mut visited, n);
  128. }
  129. if let Ok(d) = searcher.search(1, 0) {
  130. println!("{}", d);
  131. } else {
  132. println!("-1");
  133. }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement