Link della problema può essere trovato hereContare il numero di coppie non ordinate in un non-diretta grafico
Normativa Problemi
Burger città è una città che consiste di N giunzioni speciali e N -1 percorsi . Esiste esattamente un percorso più breve tra ciascuna coppia di giunzioni . La giunzione i si trova in (xi, yi) e la distanza tra due giunzioni i, j è definita dalla geometria di Taxicab.
Tim ha recentemente concesso a un taxi di lavorare come tassista. Il suo veicolo era molto economico, ma ha un difetto molto grande. Può guidare solo unità H orizzontalmente e unità V verticalmente prima di fare rifornimento.
Se un cliente desidera essere portato da i un nodo ad un altro giunzione j, allora questa macchina è solo in grado di guidare il percorso, IFF la somma delle distanze orizzontali e la somma delle distanze verticali questo percorso sono inferiore o uguale a H e V rispettivamente.
Inoltre, esiste un percorso univoco tra due giunzioni.
Ora ha intenzione di restituire il veicolo al venditore. Ma prima vuole sapere, se ne vale la pena. Ecco perché vuole che conosca il numero di coppie non ordinate (i, j) tali che non sia possibile guidare un cliente dallo svincolo i allo svincolo j.
Vincoli
2 ≤ N ≤ 10^5
0 ≤ H, V ≤ 10^14
0 ≤ xi, yi ≤ 10^9
Ho risolto questo problema con la ricorsione. Ma su alcuni dei casi di test, il mio codice sta scadendo.
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
long H = in.nextLong();
long V = in.nextLong();
List<Vertex> vertex = new ArrayList<>();
for (int i=0; i < N; i++) {
Vertex vx = new Vertex(in.nextLong(), in.nextLong());
vertex.add(vx);
}
for (int i=0; i < N-1; i++) {
int fromPath = in.nextInt()-1;
int toPath = in.nextInt()-1;
vertex.get(fromPath).neighbours.add(vertex.get(toPath));
vertex.get(toPath).neighbours.add(vertex.get(fromPath));
}
long count = 0;
for (int i=0; i < N; i++) {
count += (N - findUnorderedPairs(vertex.get(i), null, 0, 0, H, V));
}
System.out.println(count/2);
int temp = 0;
}
private static long findUnorderedPairs(Vertex vertex, Vertex previousVertex, long hor, long vert, long H, long V) {
if (hor > H || vert > V) {
return 0;
}
long result = 1;
for (Vertex v : vertex.neighbours) {
result += (v != previousVertex) ? findUnorderedPairs(v, vertex, hor + Math.abs(vertex.x - v.x), vert + Math.abs(vertex.y - v.y), H, V) : 0;
}
return result;
}
private static class Vertex {
private long x;
private long y;
public ArrayList<Vertex> neighbours;
public Vertex(long x, long y) {
this.x = x;
this.y = y;
neighbours = new ArrayList<>();
}
}
}
Ho anche provato con un'implementazione di Dijkstras, ma senza fortuna neanche lì.
Qualsiasi suggerimento su come ottenere una soluzione più rapida sarebbe davvero apprezzato.
prova l'algoritmo di kruskal – CodeFox
La descrizione è contraddittoria. Nel primo paragrafo si dice "Esiste esattamente un percorso più breve tra ogni coppia di giunzioni". Più tardi, dice, "Inoltre, c'è un percorso unico tra due giunzioni." Quindi qual è? –
@JimMischel Non vedo alcun contraddittorio, "c'è un percorso unico tra due giunzioni qualsiasi" significa che questo è un albero connesso e che il percorso unico è anche il percorso più breve. –