由文件input.txt 给出输入数据。第1 行有2 个正整数n 和m,表示给定的图G 有n 个顶点和m条边,顶点编号为1,2,…,n。接下来的m行中,每行有3 个正整数u,v,w,表示图G 的一条边(u,v)及其边权w,将编程计算出单源顶点最短路径结果输出到output.txt。,请给出java代码
时间: 2024-03-15 07:45:14 浏览: 77
(有向)带权图的单源点最短路径算法(java源码)
4星 · 用户满意度95%
以下是使用Dijkstra算法求解单源最短路径的Java代码,假设输入文件名为“input.txt”,输出文件名为“output.txt”:
```java
import java.util.*;
import java.io.*;
class Edge {
int to, weight;
public Edge(int to, int weight) {
this.to = to;
this.weight = weight;
}
}
public class ShortestPath {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new FileReader("input.txt"));
PrintWriter out = new PrintWriter(new FileWriter("output.txt"));
// 读入n和m
String[] line = in.readLine().split(" ");
int n = Integer.parseInt(line[0]);
int m = Integer.parseInt(line[1]);
// 初始化邻接表
List<Edge>[] adj = new List[n + 1];
for (int i = 1; i <= n; i++) {
adj[i] = new ArrayList<>();
}
// 读入边并构建邻接表
for (int i = 0; i < m; i++) {
line = in.readLine().split(" ");
int u = Integer.parseInt(line[0]);
int v = Integer.parseInt(line[1]);
int w = Integer.parseInt(line[2]);
adj[u].add(new Edge(v, w));
}
// 初始化距离和已访问集合
int[] dist = new int[n + 1];
boolean[] visited = new boolean[n + 1];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[1] = 0;
// 使用Dijkstra算法求解最短路径
for (int i = 1; i <= n; i++) {
int u = -1;
int minDist = Integer.MAX_VALUE;
for (int j = 1; j <= n; j++) {
if (!visited[j] && dist[j] < minDist) {
u = j;
minDist = dist[j];
}
}
if (u == -1) {
break;
}
visited[u] = true;
for (Edge e : adj[u]) {
int v = e.to;
int w = e.weight;
if (!visited[v] && dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
}
}
}
// 输出结果
for (int i = 1; i <= n; i++) {
out.println(dist[i]);
}
in.close();
out.close();
}
}
```
注意事项:
- 代码使用了Java标准库中的`java.util.List`和`java.util.ArrayList`,需要在代码开头加上`import java.util.*;`。
- 代码使用了Java标准库中的`java.io.BufferedReader`和`java.io.PrintWriter`,需要在代码开头加上`import java.io.*;`。
- 代码假设输入数据格式正确,没有进行输入数据的格式检查。实际应用中应该对输入数据进行格式检查和异常处理。
阅读全文