Topologische Sortierung
Ich konnte es umsetzen, aber Wakatte Hainai
** Sortieren Sie so, dass jede gerichtete Seite eines gerichteten Graphen ohne geschlossenen Pfad in Vorwärtsrichtung liegt **
** Was ist Directed Non-Circuit Graph (DAG) **? DAG ist ein gerichteter Graph und ein Graph ohne geschlossenen Pfad. Dies wird manchmal verwendet, um die Prozedur einer Operation zu beschreiben. DAG kann topologisch sortieren.
Topologische Sortierung Topologische Sortierungen durch dynamische Planung und Konstruktion von πDD zählen Einführung in die dynamische Planung Algorithmus und Datenstruktur
――Zum Beispiel ist der Baum 423615 in der obigen Abbildung in der folgenden Reihenfolge angeordnet.
private void solveA2() {
int v = nextInt();
int e = nextInt();
/*
*Adjazenzliste erstellen
*/
List<List<Integer>> adj = new ArrayList<List<Integer>>();
for (int i = 0; i < v; i++) {
adj.add(new ArrayList<Integer>());
}
for (int i = 0; i < e; i++) {
int from = nextInt();
int to = nextInt();
adj.get(from).add(to);
}
//Ein Array zum Bestimmen, welche Reihenfolge 0 ist
int indegree[] = new int[v];
//Urteil der Bestellung 0
for (int i = 0; i < v; i++) {
List<Integer> temp = adj.get(i);
//Knoten mit i ab
for (int node : temp) {
//Anzahl der eingehenden Bestellungen
indegree[node]++;
}
}
/*
*Warteschlange erstellen
*Packen Sie die Warteschlange mit der Reihenfolge 0
*Untersuchen Sie in der Größenordnung von 0
*/
ArrayDeque<Integer> q = new ArrayDeque<Integer>();
for (int i = 0; i < v; i++) {
if (indegree[i] == 0) {
q.addLast(i);
}
}
//Anzahl der besuchten Gipfel
int cnt = 0;
//Ergebnisse topologischer Art
List<Integer> res = new ArrayList<Integer>();
/*
* BFS
*/
while (!q.isEmpty()) {
//Beginnen Sie mit der Suche nach dem Scheitelpunkt des Verbindungsziels
int u = q.removeFirst();
//Da die Reihenfolge 0 ist, addieren Sie zum Ergebnis
res.add(u);
/*
*Die Eingabereihenfolge des Verbindungsziels neben diesem Scheitelpunkt-Machen
*Als Ergebnis die Bestellung=Wenn es 0 wird, fügen Sie es dem Sortierergebnis hinzu und verwenden Sie es für die nächste Suche.
*/
for (int node : adj.get(u)) {
indegree[node]--;
if (indegree[node] == 0) {
q.addFirst(node);
}
}
cnt++;
if (cnt > v) {
System.out.println("In der Grafik ist Zirkulation");
return;
}
}
for (int i : res) {
out.println(i);
}
}
D - Restore the Tree
Lassen Sie uns das Problem der topologischen Sortierung herausfordern
Zusammenfassend wurde die Logik der topologischen Sortierung nahezu unverändert gelöst.
AtCoder: National Unified Programming King Finale (D - Restore the Tree)
private void solveA() {
int v = nextInt();
int e = nextInt();
List<List<Integer>> rinsetuList = new ArrayList<List<Integer>>();
for (int i = 0; i < v; i++) {
rinsetuList.add(new ArrayList<Integer>());
}
int[] indegrees = new int[v];
for (int i = 0; i < v - 1 + e; i++) {
int from = nextInt() - 1;
int to = nextInt() - 1;
rinsetuList.get(from).add(to);
indegrees[to]++;
}
ArrayDeque<Integer> queue = new ArrayDeque<Integer>();
for (int i = 0; i < indegrees.length; i++) {
if (indegrees[i] == 0) {
queue.addLast(i);
}
}
int[] par = new int[v];
int cnt = 0;
while (queue.size() != 0) {
int index = queue.removeLast();
for (Integer nextDegree : rinsetuList.get(index)) {
int nextCnt = --indegrees[nextDegree];
if (nextCnt == 0) {
queue.addLast(nextDegree);
par[nextDegree] = index + 1;
}
}
if (cnt > v) {
out.println("In der Grafik ist Zirkulation");
return;
}
}
for (int i : par) {
out.println(i);
}
}
Recommended Posts