Advertisement
SergeyPGUTI

12.2.1

May 28th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.70 KB | None | 0 0
  1. http://cybern.ru/algoritm-forda-bellmana-realizaciya-na-java.html
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Scanner;
  5. import java.io.PrintWriter;
  6.  
  7.  
  8. /**
  9.  * Created by Сергей on 27.05.2016.
  10.  */
  11. public class Solution321 {
  12.     public static void main(String Args[]) {
  13.         class Edge {
  14.             int from;
  15.             int to;
  16.             int weight;
  17.  
  18.             public Edge(int u, int v, int w) {
  19.                 this.from = u;
  20.                 this.to = v;
  21.                 this.weight = w;
  22.             }
  23.         }
  24.         int INF = Integer.MAX_VALUE / 2;
  25.         Scanner sc = new Scanner(System.in);
  26.         int n = sc.nextInt();//колличество вершин
  27.         int m = sc.nextInt();//колличество ребер
  28.             Edge[] edges = new Edge[m];
  29.  
  30.  
  31.  
  32.  
  33.         int W[][] = new int[n][n];
  34.         for (int i = 0; i < n; i++) {
  35.             for (int j = 0; j < n; j++) {
  36.                 W[i][j] = INF;
  37.             }
  38.         }
  39.         int i1, j1, w1;
  40.  
  41.             for (int i = 0; i < m; i++) {
  42.                 // Считываем начальную и конечную вершину
  43.                 // i-ой дуги, а также её вес
  44.                 int from = sc.nextInt();
  45.                 int to = sc.nextInt();
  46.                 int weight = sc.nextInt();
  47.                 // Так как нами используется 0-индексация,
  48.                 // то уменьшим индексы вершин на единицу
  49.                 from--;
  50.                 to--;
  51.  
  52.                 // Кладем считанную дугу в массив дуг
  53.                 edges[i] = new Edge(from, to, weight);
  54.             }
  55.  
  56.         // Создаем массив, i-ый элемент которого
  57.         // будет хранить текущее расстояние от 1-ой
  58.         // (или 0-ой в нашем случае 0-индексации)
  59.         // до i-ой вершины графа
  60.         int[] distance = new int[n];
  61.  
  62.         // До начала работы алгоритма все расстояния,
  63.         // кроме 0-го, равны бесконечности (условной)
  64.         Arrays.fill(distance, INF);
  65.         distance[0] = 0;
  66.  
  67.         // В соответствии с алгоритмом будем
  68.         // обновлять массив расстояний
  69.         for (int i = 0; i < n - 1; i++) {
  70.             for (int j = 0; j < m; j++) {
  71.                 int from = edges[j].from;
  72.                 int to = edges[j].to;
  73.                 int weight = edges[j].weight;
  74.  
  75.                 // Ясно, что если вершина from на
  76.                 // текущем шаге работы алгоритма
  77.                 // находится бесконечно далеко от
  78.                 // 0-ой, то она не изменит ответ
  79.                 if (distance[from] == INF) {
  80.                     continue;
  81.                 }
  82.  
  83.                 // В противном случае обновим
  84.                 // расстояние до вершины to,
  85.                 // это называют релаксацией
  86.                 distance[to] = Math.min(distance[to],
  87.                         distance[from] + weight);
  88.             }
  89.         }
  90.         // Выводим расстояние от 0-ой вершины
  91.         // до каждой отличной от нее
  92.         for (int i = 0; i < n; i++) {
  93.             if (distance[i] == INF) {
  94.                 System.out.println("NO");
  95.             } else {
  96.                 System.out.println(distance[i]);
  97.             }
  98.         }
  99.  
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement