[JAVA] Je ne comprenais pas le tri topologique, alors je l'ai recherché et mis en œuvre dans BFS, puis j'ai essayé de résoudre le problème d'AtCoder.

Tri topologique

J'ai pu l'implémenter, mais Wakatte Hainai

Qu'est-ce que le tri topologique?

** 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.

Site de référence

Tri topologique Comptage des sortes topologiques et construction de πDD par planification dynamique Introduction à la planification dynamique Algorithme et structure des données

Le tri topologique semble être un arrangement d'arbres comme le montre la figure ci-dessous.

写真.png

――Par exemple, l'arborescence 423615 de la figure ci-dessus est disposée dans l'ordre suivant.

  1. Celui qui ne dépend de rien est le plus à gauche (4)
  2. Lorsque la liste de contiguïté est créée, la racine est celle dont l'ordre d'entrée (il semble être lu comme Irijisu) est 0.
  3. Vient ensuite celui qui ne dépend que de (4) (2)
  4. Suite à l'ajout de (4) à la liste du résultat et à la suppression du côté de (4) à (2), l'ordre d'entrée de (2) devient 0.
  5. La suppression du côté de (4) à (2) signifie: «Lors de l'ajout de (4) à la liste de résultats, recherchez dans la liste adjacente le côté s'étendant de (4) à d'autres sommets, puis recherchez le côté suivant. Cela signifie "moins l'ordre d'entrée de la destination de connexion".
  6. Vient ensuite celui qui ne dépend que de (2) (3 ou 6)
  7. Suite à l'ajout de (2) à la liste des résultats et à la suppression des côtés de (2) à (3) et (6), l'ordre de (3) et (6) devient 0.
  8. Ensuite, celui qui ne dépend que de (3) ou (6) ((6) si (3) est sélectionné dans [3], (6) est sélectionné dans [3] Si alors, cela ne dépend que de (2) (3) (identique à (6)) ou uniquement de (6) (1) ou (5))
  9. Ci-dessous, nous vérifierons toutes les dépendances

Essayez de mettre en œuvre avec BFS

	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);
		}
	}

Essayez de résoudre le problème d'AtCoder

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.

写真 (1).png

--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

Je ne comprenais pas le tri topologique, alors je l'ai recherché et mis en œuvre dans BFS, puis j'ai essayé de résoudre le problème d'AtCoder.
Je ne savais pas quoi écrire dans la portée de Maven, alors j'ai cherché.
[Vue Action :: Modèle manquant] Je n'ai pas compris la signification de l'instruction d'erreur, alors je l'ai recherchée.
Je n'ai pas compris la signification de DI, @Autowired ou injection, alors j'ai recherché.
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby (temps limite 10 minutes)
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
Tri des données Décroissant, croissant / Rails
J'ai essayé de résoudre le problème de la campagne paiza "Challenge from Phantom Thief 813"
J'ai essayé de résoudre le problème de Google Tech Dev Guide
Mémorandum: Quand j'ai essayé TensorFlow avec Tribuo, cela n'a pas fonctionné, alors je suis parti en voyage pour retrouver le chef de famille et je me suis perdu.
J'ai essayé de résoudre les 10 dernières questions qui devraient être résolues après m'être inscrit auprès d'AtCoder en Java
J'ai en fait exprimé le problème de la sœur aînée dans le code et l'ai calculé
J'ai essayé d'organiser la session en Rails
Je souhaite analyser morphologiquement le journal stocké dans la base de données et le stocker dans la base de données pour classer les messages 1
Je n'ai pas compris la différence entre Collections.emptyMap et Collections.EMPTY_MAP, et mon collègue s'est mis en colère, alors je vais l'écrire ici pour l'auto-discipline.
[Java] J'ai essayé de résoudre le problème de rang B de Paiza
Classes et instances Java comprises dans la figure
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai fini de regarder les roses de Versailles, alors j'ai essayé de reproduire la chanson de fin en Java
J'ai essayé de résoudre le problème de la machine à karaoké Ruby (il y a un exemple de réponse)
Comment résoudre le problème lorsque la valeur n'est pas envoyée lorsque le formulaire est désactivé dans les rails et envoyé
J'ai essayé de résoudre le problème de la boisson bonus Ruby (il y a un exemple de réponse)