8
votes

Frais dommageables minimum dans le graphique

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 .

Chaque bord dans un graphique a un coût coût positif C (U, V) (poids de bord).

tout le graphique est telle que tout le graphe > Il existe un chemin unique entre une paire de nœuds .

Nous avons également une liste l de numéro de nœud, à laquelle la bombe est placée .

Notre objectif est de Dommages / Retirez le bord 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 après dommageable, il n'y a pas de chemin entre deux bombes .

Le coût d'endommager le bord (U, V) = poids de bord (U, V) .

Donc, Nous devons endommager ces bords, de sorte que le coût total dommageable est minimal .

Exemple: xxx

Entrez l'image Description ici

xxx

ce que j'avais fait?

Jusqu'à présent, je n'avais trouvé aucun moyen efficace :(.

, comme le nombre de nœuds est n , le nombre d'arêtes est exactement n-1 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 .

J'ai essayé de modifier l'algorithme kruskal mais que cela ne m'a pas aidé non plus.

merci!


4 commentaires

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.


6 Réponses :


4
votes

Je pense qu'un kruskal modifié est la voie à suivre ici.

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

EDIT:

en cours d'exécution sur votre exemple.

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

Donc, au début, notre graphique est composé de 5 composants déconnectés.

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

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.

Le prochain est (2, 4). Cela se connecte également aux composants avec des bombes, de sorte que nous ignorons cela aussi.

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

Cela nous donne E '= {(1,2), (1, 3)}.

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


1 commentaires

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.



0
votes

Je pense que la suggestion suivante devrait fonctionner:

  • 1) Commencez par une bombe, dans votre exemple, je commence par: 0
  • 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 .
  • 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.
  • 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 . Et l'existant sera étendu: 0 -> 1 -> 2
  • 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 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).

    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)


0 commentaires

2
votes

Je pense que cela peut être fait en temps linéaire.

racine l'arborescence dans un sommet du sommet puis commencer par une traversée ascendante.

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.

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.


1 commentaires

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.



2
votes

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.


2 commentaires

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



0
votes

http://www.cs.ust.hk/ mjg_lib / classes / comp572_fall06 / notes / arbres_multicut.ps

a une description de l'algorithme.

Google HTML Version du fichier PostScript

=========================================

http: // dspace. mit.edu/bitstream/handle/1721.1/5394/or-308-95.pdf?Suence=1

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. Dalhaus ET. Al. [7] ont montré que le problème est solvable en polynôme pour K fixe sur des graphiques planaires.

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


0 commentaires

1
votes

Voici mon hypothèse:

Le graphique g est un arbre. Il n'y a donc que un chemin d'un entre deux nœuds.

Supposons qu'il existe des nœuds l rouge (bombe) et V-L blanc (nœuds non bombés). La solution nécessite la partition de g dans une forêt de sous-arbres L. Cela nécessite l'élimination d'un minimum de bords L-1 .

Chacun des tranchants retirés doit être sur un chemin entre deux nœuds rouges .

a. Taillez l'arbre g pour supprimer tous les bords que ne participez pas à un chemin entre deux nœuds rouges.

  1. Enlevez les nœuds de feuilles blanches (et le bord de l'incident) de la considération.
  2. Répétez le n ° 1 jusqu'à ce qu'il n'y ait pas de nœuds de feuilles blanches dans le graphique modifié.

    b. après (a) tous les bords laissés dans le graphique sont des bords qui forment un chemin entre deux nœuds rouges.

    Sélectionnez le bord avec le poids le plus bas dans cet arbre. Cela entraînera deux sous-arbres avec chaque arbre contenant au moins un nœud rouge.

    c. retourne à l'étape A pour chacun des sous-arbres créés en B s'il contient plus d'un nœud rouge.

    Ceci est O (V Log V) (| E | est | V | -1).


0 commentaires