Vous êtes sur la page 1sur 4

TD ODD2

Exercice 2 (Série n°2)


Master 1 GLT

BADJARA Mohamed El Amine


a) Montrons d’abord que VOYAGE_COMMERCE (VC) est dans NP.

Etant donné une constante k de VC et un ordre de passage t, construire un algorithme


polynomial qui : (i) vérifie que tous les sommets de V sont dans t une seule fois et (ii) la
longueur de t <= k.
Algorithme VERIFIER_VC; si cpt = 0 ou cpt > 1 alors
Entrées: n, k : entiers; retourner faux;
C: tableau de n x n d’entiers; fsi
t: tableau de n entier; i <- i +1;
Sorties: vrai ou faux; tant que i <= n;
var h <- 0;
i, j, h, cpt : entier; pour i <- 1 haut n-1 faire
Début h <- h + C[t[i]][t[i+1]];
i <- 1; // Le sommet qu’on doit vérifié fait
faire h <- h + C[t[n]][t[1]];
cpt <- 0; // Il compte le nbr si h <= k alors
d’apparition du sommet i retourner vrai;
j <- 1; // Position du passage dans t sinon
tant que j <= n faire retourner faux;
si t[j] = i alors fsi
cpt <- cpt + 1; Fin
fsi
j <- j + 1; Complexité : O(n²) + O(n) + O(1) = O(n²)
fait VERIFIER_VC est en O(n²) alors VC est NP.
b) Montrons maintenant qu’un problème NP-complet se réduit polynomialement à VC.

On va utiliser pour cela le problème CYCLE_HAM. Soit une instance G=(V, E) de CYCLE_HAM.
Soit G’=(V, E’) où E’={ {i,j}; i,j ∈ V, i ≠ j } un graphe complet. Posons :

0, 𝑠𝑖 𝑖, 𝑗 ∈ 𝐸
𝐶 𝑖, 𝑗 =
1, 𝑠𝑖 𝑖, 𝑗 ∉ 𝐸

Comme G est simple alors C(v, v) = 1 ∀ v ∈ V. Montrons maintenant que G contient un cycle
hamiltonien si et seulement si G’ contient une tournée de longueur <= 0.

⤇ Soit h un cycle hamiltonien de G. h est une tournée dans G’ car il contient tous les
sommets de V. De plus, toute arrête dans h est une arrête de E, par conséquent la longueur
de h par C vaut 0.

⤆ Soit h’ une tournée de G’ <= 0. Comme C(i,j) ∈ {0,1}, ∀ {i,j} ∈ E’ alors la longueur de h’ = 0.
Donc, chaque arête de h’ a une longueur égale à 0 et donc chaque arête de h’ ∈ E.
En résumé, h’ est une tournée (cycle hamiltonien) et toutes ses arêtes sont dans E alors h’ est
un cycle hamiltonien de G.
Notons que l’instance de VC peut être formée polynomialement comme suit (en O(n²)) :

pour i <- 1 haut n faire


pour j <- 1 haut n faire
si i <> j alors
E’[i,j] <- 1;
fsi
fait
fait
pour i <- 1 haut n faire
pour j <- 1 haut n faire
si E[i,j] = 1 alors
C[i,j] <- 0;
sinon
C[i,j] <- 1;
fsi
fait
fait

Vous aimerez peut-être aussi