По вот этому нужно найти диаметр графа и вывести номера 2 вершин и длину между ними! Очень срочно! В файле graph.txt такие значения
5 - количество вершин графа
1 2 5 каждая следующая строчка содержит по три числа - номера вершин между которыми ребро и его вес
1 3 3
1 5 4
2 4 6
2 5 2
3 4 4
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static final String PATH = "graph.txt";
public static void main(String[] args) throws IOException {
int[][] graph = getGraphFromString(getInput(PATH));
printGraph(graph);
System.out.println();
graph = floydAlgorithm(graph);
printGraph(graph);
}
public static String getInput(String fileName) {
StringBuilder sb = new StringBuilder();
try {
Scanner scanner = new Scanner(new File(fileName));
while (scanner.hasNextLine()) {
sb.append(scanner.nextLine()).append("\n");
}
scanner.close();
return sb.toString().trim();
} catch (IOException ex) {
ex.printStackTrace();
}
return sb.toString();
}
public static int[][] getGraphFromString(String str) throws IOException {
String[] strings = str.split("\n");
int size = Integer.parseInt(strings[0]);
int[][] graph = new int[size][size];
for (int i = 1; i < strings.length; i++) {
String[] graphData = strings[i].split(" ");
int graph1 = Integer.parseInt(graphData[0]) - 1;
int graph2 = Integer.parseInt(graphData[1]) - 1;
int weight = Integer.parseInt(graphData[2]);
if (graphData.length < 3 || graph1 >= size || graph2 >= size || graph1 < 0 || graph2 < 0)
throw new IOException("Wrong Input!");
graph[graph1][graph2] = weight;
graph[graph2][graph1] = weight;
}
return graph;
}
static void printGraph(int[][] graph) {
for (int i = 0; i < graph.length; i++) {
for (int j = 0; j < graph.length; j++)
System.out.print(graph[i][j] + " ");
System.out.println();
}
}
public static int[][] floydAlgorithm(int[][] graph) {
int[][] matrix = new int[graph.length][graph.length];
for (int i = 0; i < matrix.length; i++) {
matrix[i] = Arrays.copyOf(graph[i], graph.length);
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
for (int k = 0; k < matrix.length; k++) {
if (matrix[i][k] > 0 && matrix[k][j] > 0 && i != j) {
if (matrix[i][j] == 0 || matrix[i][j] > matrix[i][k] + matrix[k][j]) {
matrix[i][j] = matrix[i][k] + matrix[k][j];
}
}
}
}
}
return matrix;
}
}
Екстра Француз
0 уровень
Помогите пожалуйста дописать код!
Обсуждается
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Marvell QA Automation Engineer
16 января 2021, 13:33
https://site.ada.edu.az/~medv/acm/Docs%20e-olimp/Volume%2018/1796.htm
0
Дмитрий СоснинExpert
16 января 2021, 12:51
Что именно надо найти? Путь с максимальным весом или максимальным количеством вершин?
Циклы в графе допускаются?
Ориентированый или нет?
0
Стас ПасинковSoftware Developer в ZipyMaster
16 января 2021, 12:29
ты дал задачу
и дал код
а от нас что требуется, непонятно
0
AlekseiSoftware Engineer в CiscoExpert
16 января 2021, 09:40
Сессия? :)
0
Екстра Француз
16 января 2021, 10:01
Ага
0
Павел
16 января 2021, 09:40
Этому, кому? Зарабатываешь чтоль на решении лабораторных?
Что не так в приведенном тобой коде?
0
Екстра Француз
16 января 2021, 10:02
Самому нужно, сессия просто)
0
Павел
16 января 2021, 10:06
Дебагер тебе, что говорит?
0