用java编写输入格式:第一行是两个以空格符分隔的整数n和m;接下来的第二行到第m+1行,每行包含4个以空格分开的元素x,y,w和d来描述一条道路,其中x和y是一条长度为w的道路相连的两个农场的编号,d是字符N.E.S.或W,表示从x到y的道路的方向。输出格式:给出最远的一对农场之间距离的整数。 输入样例: 7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S 输出样例: 52
时间: 2024-01-21 19:16:25 浏览: 66
以下是Java的代码实现:
```java
import java.util.*;
public class Main {
static int n, m;
static int[] f;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();
f = new int[n + 1];
for (int i = 1; i <= n; i++) {
f[i] = i;
}
List<Edge> edges = new ArrayList<>();
for (int i = 0; i < m; i++) {
int x = scan.nextInt();
int y = scan.nextInt();
int w = scan.nextInt();
char d = scan.next().charAt(0);
if (d == 'N') {
edges.add(new Edge(x, y, -w, -w));
} else if (d == 'E') {
edges.add(new Edge(x, y, w, -w));
} else if (d == 'S') {
edges.add(new Edge(y, x, -w, -w));
} else if (d == 'W') {
edges.add(new Edge(y, x, w, -w));
}
}
Collections.sort(edges);
int ans = 0;
for (Edge edge : edges) {
int x = find(edge.x);
int y = find(edge.y);
if (x != y) {
f[x] = y;
ans = -edge.w;
}
}
System.out.println(ans);
}
static int find(int x) {
if (f[x] != x) {
f[x] = find(f[x]);
}
return f[x];
}
static class Edge implements Comparable<Edge> {
int x, y, w, d;
Edge(int x, int y, int w, int d) {
this.x = x;
this.y = y;
this.w = w;
this.d = d;
}
@Override
public int compareTo(Edge o) {
if (w != o.w) {
return Integer.compare(w, o.w);
} else {
return Integer.compare(d, o.d);
}
}
}
}
```
代码思路:
- 将每条道路转化为一条边,边的权值为长度,边的方向为负数(N和S方向的边)或者正数(E和W方向的边),d的值为边的方向。
- 对边按照权值从小到大排序,若权值相同则按照方向从小到大排序。
- 依次将每条边加入到最小生成树中,判断边的两个端点是否在同一个连通块中,如果不在同一个连通块中,则将这两个连通块合并,并将这条边的权值作为答案更新。
- 最终得到的答案即为最远的一对农场之间距离的整数。
阅读全文