@@ -244,6 +244,92 @@ int main() {
244
244
## 其他语言版本
245
245
246
246
### Java
247
+ ```Java
248
+ import java.util.*;
249
+
250
+ public class Main {
251
+ // 基于SPFA方法
252
+ // Define an inner class Edge
253
+ static class Edge {
254
+ int from;
255
+ int to;
256
+ int val;
257
+ public Edge(int from, int to, int val) {
258
+ this.from = from;
259
+ this.to = to;
260
+ this.val = val;
261
+ }
262
+ }
263
+
264
+ public static void main(String[] args) {
265
+ // Input processing
266
+ Scanner sc = new Scanner(System.in);
267
+ int n = sc.nextInt();
268
+ int m = sc.nextInt();
269
+ List<List<Edge>> graph = new ArrayList<>();
270
+
271
+ for (int i = 0; i <= n; i++) {
272
+ graph.add(new ArrayList<>());
273
+ }
274
+
275
+ for (int i = 0; i < m; i++) {
276
+ int from = sc.nextInt();
277
+ int to = sc.nextInt();
278
+ int val = sc.nextInt();
279
+ graph.get(from).add(new Edge(from, to, val));
280
+ }
281
+
282
+ // Declare the minDist array to record the minimum distance form current node to the original node
283
+ int[] minDist = new int[n + 1];
284
+ Arrays.fill(minDist, Integer.MAX_VALUE);
285
+ minDist[1] = 0;
286
+
287
+ // Declare a queue to store the updated nodes instead of traversing all nodes each loop for more efficiency
288
+ Queue<Integer> queue = new LinkedList<>();
289
+ queue.offer(1);
290
+
291
+ // Declare an array to record the times each node has been offered in the queue
292
+ int[] count = new int[n + 1];
293
+ count[1]++;
294
+
295
+ // Declare a boolean array to record if the current node is in the queue to optimise the processing
296
+ boolean[] isInQueue = new boolean[n + 1];
297
+
298
+ // Declare a boolean value to check if there is a negative weight loop inside the graph
299
+ boolean flag = false;
300
+
301
+ while (!queue.isEmpty()) {
302
+ int curNode = queue.poll();
303
+ isInQueue[curNode] = false; // Represents the current node is not in the queue after being polled
304
+ for (Edge edge : graph.get(curNode)) {
305
+ if (minDist[edge.to] > minDist[edge.from] + edge.val) { // Start relaxing the edge
306
+ minDist[edge.to] = minDist[edge.from] + edge.val;
307
+ if (!isInQueue[edge.to]) { // Don't add the node if it's already in the queue
308
+ queue.offer(edge.to);
309
+ count[edge.to]++;
310
+ isInQueue[edge.to] = true;
311
+ }
312
+
313
+ if (count[edge.to] == n) { // If some node has been offered in the queue more than n-1 times
314
+ flag = true;
315
+ while (!queue.isEmpty()) queue.poll();
316
+ break;
317
+ }
318
+ }
319
+ }
320
+ }
321
+
322
+ if (flag) {
323
+ System.out.println("circle");
324
+ } else if (minDist[n] == Integer.MAX_VALUE) {
325
+ System.out.println("unconnected");
326
+ } else {
327
+ System.out.println(minDist[n]);
328
+ }
329
+ }
330
+ }
331
+
332
+ ```
247
333
248
334
### Python
249
335
0 commit comments