Nous avons reçu un graphique g (V, E) avec n nœuds (numérotés de 0 à N-1) et exactement (N-1) bords à deux voies em> fort >. Chaque bord dans un graphique a un coût tout le graphique est telle que tout le graphe > Il existe un chemin unique entre une paire de nœuds forte> em>. p> Nous avons également une liste Notre objectif est de Dommages / Retirez le bord fort> du graphique tel que, après endommageant / enlever les bords du graphique, il n'y a pas de connexion entre les bombes - < / p> qui est Le coût Donc, Nous devons endommager ces bords, de sorte que le coût total dommageable est minimal fort>. p> Exemple: p> xxx pré> ce que j'avais fait? strong> p> Jusqu'à présent, je n'avais trouvé aucun moyen efficace :(. P> , comme le nombre de nœuds est J'ai essayé de modifier l'algorithme kruskal mais que cela ne m'a pas aidé non plus. P > merci! p> p> p>
n code>, le nombre d'arêtes est exactement
n-1 code> et tout le graphe est tel qu'il existe un chemin unique entre n'importe quelle paire de nœuds, i obtenu une conclusion que le graphique est un arbre em> fort>. p>
6 Réponses :
Je pense qu'un kruskal modifié est la voie à suivre ici. P>
Prenez le graphique g '= (v', e '), v' = v, e '= {}. Triez les bords dans E dans l'ordre de coût non croissant. Maintenant, pour chaque bord de E, ajoutez-le à E 'IFF, il ne connecte pas deux composants qui ont les deux sommets avec des bombes. Le résultat est la somme des coûts de E-E '. P>
EDIT: P>
en cours d'exécution sur votre exemple. p>
Initialement, notre ensemble d'arêtes est vide {}, et nous prenons les bords triés dans l'ordre non croissant [(1, 2), (0, 1), (2, 4), (1, 3)] p>
Donc, au début, notre graphique est composé de 5 composants déconnectés. P>
(1, 2) a un coût de 8, et seul l'un des composants qu'il connecte a une bombe. Nous l'ajoutons donc à E '. E '= {(1, 2)} et nous avons 4 composants. P>
Le bord de coût supérieur suivant est (0, 1) avec un coût de 5. Mais les deux composants ont des bombes, donc ne pas ajouter ce bord. P>
Le prochain est (2, 4). Cela se connecte également aux composants avec des bombes, de sorte que nous ignorons cela aussi. P>
Enfin, le bord de coût le plus bas est (1, 3). Étant donné qu'un de ses composants (contenant uniquement le nœud 3) n'a pas de bombe, nous l'ajoutons à E '. P>
Cela nous donne E '= {(1,2), (1, 3)}. P>
Mon raisonnement est que nous essayons d'ajouter des bords avec des coûts plus élevés avant ceux avec des coûts inférieurs - ce qui garantit que dans n'importe quel chemin entre les nœuds avec des bombes contenant des bombes dans le nœud d'origine, tout sauf le coût le plus bas sera ajouté. P>
MAK, pouvez-vous s'il vous plaît donner un exemple.je Ne pensez pas que cette approche fonctionne comme il y a toujours une composante connectée car "L'ensemble du graphe est tel qu'il existe un chemin unique entre une paire de nœuds". Veuillez me corriger si je me trompe si je me trompe , je pense que si vous pouvez illustrer votre approche, prenant l'exemple d'entrée comme exemple, il sera beaucoup plus facile de comprendre.
Je pense que la suggestion suivante devrait fonctionner: p>
0 code> li>
- 2) Créez des chemins sorcière tous les nœuds adjacents. Alors prenez toutes les relations et démarrez un chemin avec eux. Dans votre exemple, il lancera un chemin:
0 -> 1 code>. Li>
- 3) Si vous frappez une autre bombe sur un chemin, vous retirez le bord avec le coût le plus bas. Dans l'exemple, nous ne frappons pas une bombe, nous continuons donc avec Step2. Li>
- 3a) Pas encore de bombe dans aucun chemin. Continuez avec l'étape 2 et étendez les chemins avec les nouveaux nœuds adjacents. Dans votre cas, un nouveau chemin sera créé:
1 -> 3 code>. Et l'existant sera étendu: 0 -> 1 -> 2 code> li>
- 3b) Une bombe se trouve sur le chemin. Prenez le chemin où la bombe est trouvée et retirez le bord avec le coût le plus bas. Dans votre exemple, le chemin
0 -> 1 -> 2 code> contient une bombe (2). Nous supprimons donc la relation avec le coût 5. Retirez le chemin du «TODO» et continuez par l'étape 2 sur les derniers nœuds atteints (2 et 3). Li>
ul>
i la fin que vous devriez traverser chaque noeud exactement une fois.
Si je ne me trompe pas la complexité devrait être sur O (n journal n) p>
Je pense que cela peut être fait en temps linéaire. P>
racine l'arborescence dans un sommet du sommet puis commencer par une traversée ascendante. p>
Commencez avec une feuille. S'il n'y a pas de bombe, coupez la feuille et déplacez-vous. S'il y a une bombe, vous devez couper un bord sur un chemin vers cette feuille. Propager des informations sur le bord le moins cher à cette feuille. P>
Puis, lorsque vous êtes dans le sommet intérieur, vous avez ces possibilités: S'il y a une bombe au sommet et des bombes ci-dessous, coupez les chemins les moins chers pour tous. S'il n'y a pas de bombe et une seule bombe ci-dessous, propager des informations sur le chemin le moins cher. S'il y a plus de bombes ci-dessous, coupez chacun sauf un avec le chemin le plus coûteux. P>
Je pensais de la même manière, mais je ne pouvais pas venir à un algorithme final, votre idée de se souvenir des sous-arbres qui sont équivalents à une bombe, je pense.
C'est le problème coupé multi-voitures dans les arbres. Il peut être résolu en polynôme de temps par une programmation dynamique simple. Voir Chopra and Rao: " sur le polyèdre de coupe multi-plates ", réseaux 21 (1): 51-89, 1991. P>
Belle réponse, imo il est préférable de fournir une définition de multi-mailles.
cs.st.hk/mjg_lib/classes/comp572_fall06/notes/ Tree_Multicut .ps a une description de l'algorithme. Google.com/...
http://www.cs.ust.hk/ mjg_lib / classes / comp572_fall06 / notes / arbres_multicut.ps p>
a une description de l'algorithme. P>
Google HTML Version du fichier PostScript P>
========================================= P>
http: // dspace. mit.edu/bitstream/handle/1721.1/5394/or-308-95.pdf?Suence=1 P>
Le cas K = 2 n'est pas la seule instance solvable polynoméale du problème de coupe multiple. Lovdsz [12] et cherkasskij [3] montrent que lorsque ce = 1 ve e e e e et g est Eulerian, puis la multi-voie Le problème coupé est solvable polnométrique. erdos et sz6kely [8] ont montré qu'une généralisation de Le problème de coupe multiple est solvable polnométrique lorsque le graphique sous-jacent G est un arbre. strong> Dalhaus ET. Al. [7] ont montré que le problème est solvable en polynôme pour K fixe sur des graphiques planaires. P> blockQuote>
J'avais écrit une solution à base d'algorithme gourmande simple la nuit dernière qui consistait à éliminer les nœuds qui ne sont pas sur un chemin entre deux nœuds rouges (bornes), puis en sélectionnant le plus petit nœud de poids, puis répétant le processus sur le sous- des arbres. J'ai supprimé que, depuis que la lecture a suggéré de suggérer que le problème est NP. Mais cette référence suggère qu'il y a une solution polynomiale ... P>
Voici mon hypothèse: p>
Le graphique Supposons qu'il existe des nœuds Chacun des tranchants retirés doit être sur Sélectionnez le bord avec le poids le plus bas fort> em> dans cet arbre. Cela entraînera deux sous-arbres avec chaque arbre contenant au moins un nœud rouge. P>
Ceci est O (V Log V) (| E | est | V | -1). P>
Je crois qu'une approche gourmande (enlever le sommet le plus bas de chaque chemin) a une chance dans un arbre, mais je ne suis pas sûr de cela: \ Aussi: Que trouveriez-vous comme une approche efficace?
@ Amit, jusqu'à présent, je ne suis pas trop capable de trouver une méthode efficace, de résoudre ceci.Le numéro de contrainte de nœuds = 100 000, cela signifie des bords totaux = 100 000-1. SO O (N LOG N) L'algorithme sera pratique et efficace.
@Tall :: Ajout des contraintes comme une édition.
Si le graphique est complètement connecté, il est arboré, mais sinon, il peut s'agir d'un graphique normal.