kk
This commit is contained in:
@@ -4,67 +4,187 @@ import java.util.*;
|
|||||||
|
|
||||||
class Solution {
|
class Solution {
|
||||||
|
|
||||||
long res = 0;
|
long res = 0;
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
|
|
||||||
public long minimumFuelCost(int[][] roads, int seats) {
|
public long minimumFuelCost(int[][] roads, int seats) {
|
||||||
List<Integer>[] map = new List[roads.length + 1];
|
List<Integer>[] map = new List[roads.length + 1];
|
||||||
for (int i = 0; i < map.length; i++) {
|
for (int i = 0; i < map.length; i++) {
|
||||||
map[i] = new ArrayList<>();
|
map[i] = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int[] road : roads) {
|
for (int[] road : roads) {
|
||||||
map[road[0]].add(road[1]);
|
map[road[0]].add(road[1]);
|
||||||
map[road[1]].add(road[0]);
|
map[road[1]].add(road[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
dfs(0, -1, seats, map);
|
dfs(0, -1, seats, map);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dfs(int start, int from, int seats, List<Integer>[] map) {
|
int dfs(int start, int from, int seats, List<Integer>[] map) {
|
||||||
int cur = 1;
|
int cur = 1;
|
||||||
for (Integer i : map[start]) {
|
for (Integer i : map[start]) {
|
||||||
if (i != from) {
|
if (i != from) {
|
||||||
int childSum = dfs(i, start, seats, map);
|
int childSum = dfs(i, start, seats, map);
|
||||||
cur += childSum;
|
cur += childSum;
|
||||||
res += (childSum + seats - 1) / seats;
|
res += (childSum + seats - 1) / seats;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cur;
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1466. 重新规划路线
|
// 1466. 重新规划路线
|
||||||
public int minReorder(int n, int[][] connections) {
|
public int minReorder(int n, int[][] connections) {
|
||||||
List<Integer>[] list = new List[n];
|
List<Integer>[] list = new List[n];
|
||||||
List<Integer>[] otherList = new List[n];
|
List<Integer>[] otherList = new List[n];
|
||||||
for (int i = 0; i < list.length; i++) {
|
for (int i = 0; i < list.length; i++) {
|
||||||
list[i] = new ArrayList<>();
|
list[i] = new ArrayList<>();
|
||||||
otherList[i] = new ArrayList<>();
|
otherList[i] = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int[] ints : connections) {
|
for (int[] ints : connections) {
|
||||||
list[ints[0]].add(ints[1]);
|
list[ints[0]].add(ints[1]);
|
||||||
otherList[ints[1]].add(ints[0]);
|
otherList[ints[1]].add(ints[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
dfs(0, -1, list, otherList);
|
dfs(0, -1, list, otherList);
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dfs(int now, int parent, List<Integer>[] list, List<Integer>[] otherList) {
|
private void dfs(int now, int parent, List<Integer>[] list, List<Integer>[] otherList) {
|
||||||
for (int i = 0; i < list[now].size(); i++) {
|
for (int i = 0; i < list[now].size(); i++) {
|
||||||
if (list[now].get(i) != parent) {
|
if (list[now].get(i) != parent) {
|
||||||
sum++;
|
sum++;
|
||||||
dfs(list[now].get(i), now, list, otherList);
|
dfs(list[now].get(i), now, list, otherList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < otherList[now].size(); i++) {
|
for (int i = 0; i < otherList[now].size(); i++) {
|
||||||
if (otherList[now].get(i) != parent) {
|
if (otherList[now].get(i) != parent) {
|
||||||
dfs(otherList[now].get(i), now, list, otherList);
|
dfs(otherList[now].get(i), now, list, otherList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int min = Integer.MAX_VALUE;
|
||||||
|
|
||||||
|
int N = 10001;
|
||||||
|
int[] union = new int[N];
|
||||||
|
|
||||||
|
int find(int x) {
|
||||||
|
while (union[x] != x) {
|
||||||
|
union[x] = union[union[x]];
|
||||||
|
x = union[x];
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用并查集
|
||||||
|
public int minimumEffortPath(int[][] heights) {
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
union[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int n = heights.length;
|
||||||
|
int m = heights[0].length;
|
||||||
|
List<int[]> list = new ArrayList<>(1000001);
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
for (int j = 0; j < m; j++) {
|
||||||
|
int idx = index(i, j, n, m);
|
||||||
|
int i1 = index(i, j + 1, n, m);
|
||||||
|
int i2 = index(i + 1, j, n, m);
|
||||||
|
if (i1 != -1) {
|
||||||
|
int hei = Math.abs(heights[i][j]-heights[i][j+1]);
|
||||||
|
list.add(new int[]{idx, i1, hei});
|
||||||
|
}
|
||||||
|
if (i2 != -1) {
|
||||||
|
int hei = Math.abs(heights[i][j]-heights[i+1][j]);
|
||||||
|
list.add(new int[]{idx, i2, hei});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int[] ints : list) {
|
||||||
|
union[find(ints[0])] = find(ints[1]);
|
||||||
|
if (find(0)==find(n*m-1)) {
|
||||||
|
return ints[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int index(int i, int j, int n, int m) {
|
||||||
|
if (i < 0 || j < 0 || i >= n || j >= m) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (i * m) + j;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Solution1 {
|
||||||
|
|
||||||
|
private int[] parent;
|
||||||
|
private Edge[] edges = new Edge[1000001];
|
||||||
|
|
||||||
|
public int minimumEffortPath(int[][] heights) {
|
||||||
|
int m = heights.length, n = heights[0].length;
|
||||||
|
if (m == 1 && n == 1) return 0;
|
||||||
|
|
||||||
|
parent = new int[m * n];
|
||||||
|
for (int i = 0; i < m * n; i++) parent[i] = i;
|
||||||
|
|
||||||
|
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
|
||||||
|
|
||||||
|
for (int i = 0; i < m; i++) {
|
||||||
|
for (int j = 0; j < n; j++) {
|
||||||
|
if (i < m-1) {
|
||||||
|
int diff = Math.abs(heights[i][j] - heights[i+1][j]);
|
||||||
|
edges[diff] = new Edge(i * n + j, (i+1) * n + j, edges[diff]);
|
||||||
|
if(diff > max) max = diff;
|
||||||
|
if(diff < min) min = diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j < n-1) {
|
||||||
|
int diff = Math.abs(heights[i][j] - heights[i][j+1]);
|
||||||
|
edges[diff] = new Edge(i * n + j, i * n + (j+1), edges[diff]);
|
||||||
|
if(diff > max) max = diff;
|
||||||
|
if(diff < min) min = diff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = min; i <= max; ++i){
|
||||||
|
for (Edge e = edges[i]; e != null; e = e.next) {
|
||||||
|
int xParent = find(e.x, parent), yParent = find(e.y, parent);
|
||||||
|
parent[xParent] = yParent;
|
||||||
|
|
||||||
|
if (find(0, parent) == find(m * n -1, parent)) return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int find(int x, int[] parent) {
|
||||||
|
while (parent[x] != x) {
|
||||||
|
parent[x] = parent[parent[x]];
|
||||||
|
x = parent[x];
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Edge {
|
||||||
|
int x, y;
|
||||||
|
Edge next;
|
||||||
|
|
||||||
|
Edge(int x, int y, Edge next) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.next = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user