首先有两个集合 A和B,两个集合都有n个点,编号都是从 1到n。 A集合中,第i号点 (1≤i≤n-1) 向第计1号点连一条权值为 y的无向边。 B集合中,第i号点 (1≤i≤n-1) 向第计1号点连一条权值为 y的无向边。 A集合第i号点 (1≤i≤n)向B集合第i号点连一条权值为x的无向边。 B集合第i号点 (1≤i≤n一1)向A集合第i 1号点连一条权值为x的无向边。 现在给定 A 集合编号为a的点和 B 集合编号为b的点,求a到b的最短距离。请编写Java程序
时间: 2024-03-27 17:35:27 浏览: 61
用java编写的求两点之间的距离
3星 · 编辑精心推荐
以下是代码实现:
```java
import java.util.*;
public class Main {
static int MAXN = 100005;
static List<Edge>[] graph = new List[MAXN];
static boolean[] visA = new boolean[MAXN];
static boolean[] visB = new boolean[MAXN];
static int[] disA = new int[MAXN];
static int[] disB = new int[MAXN];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt();
int a = sc.nextInt();
int b = sc.nextInt();
for (int i = 0; i < MAXN; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 1; i < n; i++) {
graph[i].add(new Edge(i + 1, y));
graph[i + 1].add(new Edge(i, y));
graph[i + n].add(new Edge(i + n + 1, y));
graph[i + n + 1].add(new Edge(i + n, y));
graph[i].add(new Edge(i + n, x));
graph[i + n].add(new Edge(i, x));
}
dijkstra(a, disA, visA);
dijkstra(b + n, disB, visB);
int ans = disA[b + n];
for (int i = 1; i <= n; i++) {
ans = Math.min(ans, disA[i] + disB[i + n]);
}
System.out.println(ans);
}
static void dijkstra(int start, int[] dis, boolean[] vis) {
Arrays.fill(dis, Integer.MAX_VALUE);
PriorityQueue<Edge> pq = new PriorityQueue<>();
pq.offer(new Edge(start, 0));
dis[start] = 0;
while (!pq.isEmpty()) {
Edge cur = pq.poll();
if (vis[cur.to]) {
continue;
}
vis[cur.to] = true;
for (Edge e : graph[cur.to]) {
if (dis[e.to] > dis[cur.to] + e.cost) {
dis[e.to] = dis[cur.to] + e.cost;
pq.offer(new Edge(e.to, dis[e.to]));
}
}
}
}
static class Edge implements Comparable<Edge> {
int to;
int cost;
public Edge(int to, int cost) {
this.to = to;
this.cost = cost;
}
@Override
public int compareTo(Edge o) {
return cost - o.cost;
}
}
}
```
这里使用了 Dijkstra 算法来求解。首先建图,根据题目中的要求添加边。然后分别以集合 A 中编号为 a 的点和集合 B 中编号为 b 的点为起点,分别使用 Dijkstra 算法求出到每个点的最短距离。最后,枚举所有的点,计算经过该点的最短距离,并取最小值即为答案。
阅读全文