Tri topologique
J'ai pu l'implémenter, mais Wakatte Hainai
** Trier de manière à ce que chaque côté dirigé d'un graphe orienté sans chemin fermé soit dans le sens avant **
** Qu'est-ce qu'un graphique non-tour dirigé (DAG) **? DAG est un graphe orienté et un graphe sans chemin fermé. Ceci est parfois utilisé pour décrire la procédure d'une opération. Le DAG peut effectuer un tri topologique.
Tri topologique Comptage des sortes topologiques et construction de πDD par planification dynamique Introduction à la planification dynamique Algorithme et structure des données
――Par exemple, l'arborescence 423615 de la figure ci-dessus est disposée dans l'ordre suivant.
private void solveA2() {
int v = nextInt();
int e = nextInt();
/*
*Créer une liste de contiguïté
*/
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);
}
//Un tableau pour déterminer quel ordre est 0
int indegree[] = new int[v];
//Jugement d'ordre 0
for (int i = 0; i < v; i++) {
List<Integer> temp = adj.get(i);
//Nœuds avec i à partir de
for (int node : temp) {
//Nombre de commandes entrantes
indegree[node]++;
}
}
/*
*Créer une file d'attente
*Emballez la file d'attente avec 0 commande
*Rechercher à partir de l'ordre de 0
*/
ArrayDeque<Integer> q = new ArrayDeque<Integer>();
for (int i = 0; i < v; i++) {
if (indegree[i] == 0) {
q.addLast(i);
}
}
//Nombre de pics visités
int cnt = 0;
//Résultats du tri topologique
List<Integer> res = new ArrayList<Integer>();
/*
* BFS
*/
while (!q.isEmpty()) {
//Commencez à rechercher le sommet de destination de la connexion
int u = q.removeFirst();
//Puisque l'ordre est 0, ajoutez au résultat
res.add(u);
/*
*L'ordre d'entrée de la destination de connexion à côté de ce sommet-Faire
*En conséquence, la commande=S'il devient 0, ajoutez-le au résultat du tri et utilisez-le pour la recherche suivante.
*/
for (int node : adj.get(u)) {
indegree[node]--;
if (indegree[node] == 0) {
q.addFirst(node);
}
}
cnt++;
if (cnt > v) {
System.out.println("Il y a circulation dans le graphique");
return;
}
}
for (int i : res) {
out.println(i);
}
}
D - Restore the Tree
Remettons en question le problème de l'utilisation du tri topologique
En conclusion, la logique du tri topologique a été résolue avec presque aucune modification.
--La structure de l'exemple d'entrée 2 est ci-dessus
AtCoder: National Unified Programming King Finals (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("Il y a circulation dans le graphique");
return;
}
}
for (int i : par) {
out.println(i);
}
}
Recommended Posts