Dags Connexité 1. Rappel sur les listes class Liste { int val; Liste suivant; Liste (int x, Liste s) { val = x; suivant = s; } }

Documents pareils
Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Programme Compte bancaire (code)

TD3: tableaux avancées, première classe et chaînes

Les structures de données. Rajae El Ouazzani

STAGE IREM 0- Premiers pas en Python

Plan du cours. Historique du langage Nouveautés de Java 7

Package Java.util Classe générique

Les arbres binaires de recherche

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Programmation avec des objets : Cours 7. Menu du jour

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Premiers Pas en Programmation Objet : les Classes et les Objets

Utilisation d objets : String et ArrayList

TD 1 - Structures de Traits et Unification

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Corrigé des exercices sur les références

Projet de programmation (IK3) : TP n 1 Correction

Chapitre 10. Les interfaces Comparable et Comparator 1

Solutions du chapitre 4

Java Licence Professionnelle CISII,

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

L exclusion mutuelle distribuée

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Tp 1 correction. Structures de données (IF2)

Représentation d un entier en base b

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation par les Objets en Java

Université Kasdi Merbeh Ouargla FSSI/ Département des maths et de l informatique Corrigé type TD N 8 de ASD2 (Les Graphes)

Licence Sciences et Technologies Examen janvier 2010

TD/TP PAC - Programmation n 3

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Objets et Programmation. origine des langages orientés-objet

Continuité et dérivabilité d une fonction

La NP-complétude. Johanne Cohen. PRISM/CNRS, Versailles, France.

Flux de données Lecture/Ecriture Fichiers

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Exercices sur les interfaces

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

TP1 : Initiation à Java et Eclipse

Algorithmique et Programmation, IMA

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

ACTIVITÉ DE PROGRAMMATION

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Un ordonnanceur stupide

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Chapitre 5 : Flot maximal dans un graphe

Le prototype de la fonction main()

Cours d initiation à la programmation en C++ Johann Cuenin

TP3 : Manipulation et implantation de systèmes de fichiers 1

Cours Programmation Système

TP, première séquence d exercices.

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmer en JAVA. par Tama

Gestion distribuée (par sockets) de banque en Java

INF 321 : mémento de la syntaxe de Java

Théorie des Graphes Cours 3: Forêts et Arbres II / Modélisation

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Resolution limit in community detection

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

2. Comprendre les définitions de classes

Cours 1: Java et les objets

La mesure de Lebesgue sur la droite réelle

I. Polynômes de Tchebychev

Chapitre 6. Fonction réelle d une variable réelle

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

MIS 102 Initiation à l Informatique

as Architecture des Systèmes d Information

Les bases de l informatique et de la programmation. École polytechnique

Grammaires d unification

Corrigés des premiers exercices sur les classes

Introduction aux algorithmes répartis

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Les algorithmes de base du graphisme

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Arbres binaires de recherche

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Introduction à JDBC. Accès aux bases de données en Java

Cours de Master Recherche

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Programmation Par Objets

INITIATION AU LANGAGE JAVA

Problèmes liés à la concurrence

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Conventions d écriture et outils de mise au point

TD/TP PAC - Programmation n 3

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Chapitre VI- La validation de la composition.

Algorithmique, Structures de données et langage C

Auto-évaluation Programmation en Java

Programmation C++ (débutant)/instructions for, while et do...while

Introduction à la théorie des graphes. Solutions des exercices

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Transcription:

Inf Cours Dags Connexité jeanjacqueslevynet secrétariat de l enseignement: Catherine Bensoussan cb@lixpolytechniquefr Aile, LIX, Rappel sur les listes class Liste { int val; Liste suivant; Liste (int x, Liste s) { val = x; suivant = s; class X { static Liste listevide = null; public static void main (String[ ] args) { Liste troiselements = new Liste(, new Liste(, new Liste(, null))); troiselementssuivantval = ; Systemoutprintln (troiselementssuivantsuivantval); troiselements = new Liste (, troiselementssuivant); Listes d entiers wwwenseignementpolytechniquefr/informatique/if troiselements val suivant val suivant val suivant val suivant Délégués Parcours en profondeur (/) final static int BLANC =, GRIS =, NOIR = ; static numordre; Deux délégués pour IF Délégués PC/TD Plan static void visiter (Graphe g) { int n = gsucclength; int[ ] couleur = new int[n]; numordre = -; for (int x = ; x < n; ++x) num[x] = -; for (int x = ; x < n; ++x) couleur[x] = BLANC; for (int x = ; x < n; ++x) if (couleur[x] == BLANC) dfs(g, x, couleur, num); Arbres de recouvrement Détection de cycles Tri topologique Composantes connexes Bi-connexité et points d articulation static void dfs (Graphe g, int x, int[ ] couleur, int[ ] num) { num[x] = ++numordre; Pour tout y successeur de x dans G faire { if (couleur[y] == BLANC) dfs(g, y, couleur, num); couleur[x] = NOIR;

Parcours en profondeur (/) final static int BLANC =, GRIS =, NOIR = ; static numordre; static void visiter (Graphe g) { int n = gsucclength; int[ ] couleur = new int[n]; numordre = -; for (int x = ; x < n; ++x) num[x] = -; for (int x = ; x < n; ++x) couleur[x] = BLANC; for (int x = ; x < n; ++x) if (couleur[x] == BLANC) dfs(g, x, couleur, num); static void dfs (Graphe g, int x, int[ ] couleur, int[ ] num) { num[x] = ++numordre; for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; if (couleur[y] == BLANC) dfs(g, y, couleur, num); couleur[x] = NOIR; Arbres de recouvrement (/) sortes d arcs par rapport aux branches d un arbre de recouvrement : d un nœud de l arbre à un fils dans l arbre d un nœud de l arbre à un ancètre dans l arbre d un nœud de l arbre à un descendant non direct dans l arbre d un nœud à un cousin dans l arbre (forêt) Sortie de labyrinthe On cherche un chemin de x à s Exécution static Liste chemin (Graphe g, int x, int s, int[ ] couleur) { if (x == s) return new Liste (x, null); for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; if (couleur[y] == BLANC) { Liste r = chemin (g, y, s); if (r!= null) return new Liste (x, r); return null; chemin retourne la liste des sommets sur le chemin trouvé vers la sortie s Ne pas oublier que la fonction dfs peut retourner un résultat Complexité en temps en O(V + E) Arbres de recouvrement (/) Mais, dans un graphe non-orienté, deux sortes d arcs dans dfs : Rappel : Dans notre représentation des graphes non-orientés, un arc coexiste avec son arc inverse ; donc les cas -, - coexistent Graphe non-orienté pas d arcs de type pas d arcs transverses

Arbres de recouvrement (/) Détection de cycles (/) d(x) est le temps où x devient GRIS dans dfs f(x) est le temps où x devient NOIR dans dfs Proposition [Intervalles parenthésés] Soient s et t deux sommets Alors cas seulement : les intervalles [d(s), f(s)] et [d(t), f(t)] sont disjoints et s et t sont cousins dans l arbre de recouvrement ; l intervalle [d(s), f(s)] contient [d(t), f(t)] et s admet t comme descendant dans l arbre de recouvrement ; l intervalle [d(s), f(s)] est contenu dans [d(t), f(t)] et s admet t comme ancêtre dans l arbre de recouvrement ; Proposition [Caractérisation par numéros] Soit e un arc de s à t Alors : e est de type ou ssi num[s] < num[t] graphe avec cycle arbre de recouvrement e est de type ou ssi num[s] > num[t] Cycle ss il existe un arc de type pendant la construction de l arbre de recouvrement Arbres de recouvrement (/) Détection de cycles (/) Soit d(e) le temps où on considère l arc e pour la première fois dans dfs Proposition [Caractérisation par couleurs] Soit e un arc de s à t Alors : e est de type ssi couleur[t] = BLANC au temps d(e) Définition Le point d attache d un cycle est le premier sommet du cycle visité par dfs Le point d attache est le sommet s du cycle dont num[s] est minimal e est de type ssi couleur[t] = GRIS au temps d(e) e est de type ou ssi couleur[t] = NOIR au temps d(e) Proposition Le graphe est cyclique ss il existe un arc e vers un sommet GRIS au temps d(e) Un chemin blanc est un chemin dont tous les sommets intermédiaires sont BLANCs Proposition [Chemins blancs] Le sommet t est un descendant de s dans un arbre de recouvrement ssi il existe un chemin blanc de s GRIS vers t BLANC lors de l exploration de s par le dfs correspondant Démonstration S il existe un arc e de s à t GRIS au temps d(e), alors e est un arc de type Il existe un cyle de t passant par s et revenant à t S il existe un cycle de point d attache t, au début de l exploration du cycle le sommet t est GRIS, les autres sont BLANCs dans le cycle Il existe un chemin blanc de t au prédécesseur t de t dans le cycle Donc t est un descendant de t dans l arbre de recouvrement Et il existe un arc e de t à t GRIS au temps d(e)

Détection de cycles (/) Tri topologique (/) final static int BLANC =, GRIS =, NOIR = ; static boolean acyclique (Graphe g) { int n = gsucclength; int[ ] couleur = new int[n]; for (int x=; x < n; ++x) couleur[x] = BLANC; for (int x=; x < n; ++x) if ( couleur[x] == BLANC && cycleen(g, x, couleur) ) return false; return true; static boolean cycleen(graphe g, int x, int[ ] couleur) { for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; if ( couleur[y] == GRIS couleur[y] == BLANC && cycleen(g, y, couleur) ) return true; couleur[x] = NOIR; return false; Ordre de lecture des chapîtres du livre de H P Barendregt The λ-calculus : its syntax and semantics North-Holland, Autre exemple : trouver l ordre d exécution des tâches d un projet à partir du graphe de dépendances (ordonnancement) Tri topologique (/) Tri topologique (/) G = (V, E) est un graphe acyclique (dag : directed acyclic graph) Si le sommet terminal est connu, un parcours en profondeur suffit Donner une liste des sommets v i i = n dans un ordre compatible avec l ordre induit par G : v i < v j v j v i préparer le cours cours voiture s habiller se réveiller manger café final static int BLANC =, GRIS =, NOIR = ; static Liste afaire (Graphe g, int x) { int n = gsucclength; int[ ] couleur = new int[n]; for (int x = ; x < n; ++x) couleur[x] = BLANC; return dfs(g, x, null, couleur); static Liste dfs(graphe g, int x, Liste r, int[ ] couleur) { for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; if (couleur[y] == BLANC) r = dfs(g, y, r, couleur); return new Liste (x, r); (trouver un ordre total compatible avec un ordre partiel donné) r est un accumulateur pour le résultat liste des sommets à faire

Tri topologique (/) Pour trouver les sommets terminaux (dont aucun autre ne dépend), un parcours linéaire des arcs suffit static boolean[ ] calculerterminaux (Graphe g) { int n = gsucclength; int[ ] terminal = new boolean[n]; for (int x = ; x < n; ++x) terminal[x] = true; for (int x = ; x < n; ++x) for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; terminal[y] = false; return terminal; Composantes connexes (/) Le graphe est non-orienté Complexité en O(V + E) Autre algorithme [Knuth] sur le graphe inverse Connexité Composantes connexes (/) Existe-t il un chemin entre deux sommets? (dfs ; cf sortie de labyrinthe) Complexité O(V + E) Trouver l ensemble des sommets accessibles depuis un sommet (dfs) Complexité O(V + E) Trouver les ensembles de sommets interconnectés dans un graphe non-orienté Composantes connexes (cf plus loin ; dfs) Complexité O(V + E) Même problème dans un graphe orienté? Composantes fortement connexes (cf plus loin ; dfs) Complexité O(V + E) static void imprimercompconnexes (Graphe g) { int n = gsucclength; int[ ] couleur = new int[n]; for (int x = ; x < n; ++x) couleur[x] = BLANC; for (int x = ; x < n; ++x) { if (couleur[y] == BLANC) { imprimercomposantede(g, x, couleur); Systemoutprintln(); static void imprimercomposantede(graphe g, int x, int[ ] couleur) { Systemoutprint (x + " "); for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; if (couleur[y] == BLANC) imprimercomposantede(g, y, couleur); Exercice Ecrire une fonction qui rend la liste des composantes connexes

Bi-connexité (/) Bi-connexité (/) Dans un graphe non-orienté, existe-t-il chemins différents entre toute paire de nœuds? Un point d articulation est un point qui sépare le graphe en parties non connexes si on l enlève Définition Un circuit est un chemin formé par les arcs e, e, e n (n ) tels que : ext(e i ) = org(e i+ ) pour i < n ext(e n ) = org(e ) Définition Un circuit élémentaire est un chemin dont tous les sommets sont distincts (à l exception du premier et du dernier) Proposition Le point d attache de x est le point d attache t de numéro num[t] minimum parmi tous les circuits élémentaires passant par x Un graphe connexe sans point d articulation est bi-connexe Exemples : les rues de Paris, la distribution d électricité, la topologie d un réseau informatique, etc Il vaut mieux que ces graphes soient bi-connexes Bi-connexité (/) Bi-connexité (/) Vue de l arbre de recouvrement Le point d attache de x est le sommet t avec le plus petit num[t] tel qu un chemin relie x à t avec au plus un seul arc de retour Un point d articulation x a un descendant direct y dont le point d attache t vérifie num[x] num[t] Par exemple : x {,,

Bi-connexité (/) Bi-connexité (/) Calcul (en dfs) du numéro de parcours du point d attache de x static int attache(graphe g, int x) { int min = num[x] = ++numordre; for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; int m; if (num[y] == -) { m = attache(g, y); if (m >= num[x]) articulation[x] = true; else m = num[y]; min = Mathmin (min, m); return min; static void attache(graphe g, int x) { num[x] = ++numordre; int nfils = ; for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; if (num[y] == -) { ++nfils; attache(g, y); articulation[x] = nfils > ; On peut déplier cette fonction (inlining) dans trouverarticulations Bi-connexité (/) Bi-connexité (/) Avec le critère précédent, tout sommet à la racine de l arbre de recouvrement serait un point d articulation Correction : le sommet à la racine de l arbre de recouvrement est un point d articulation ssi ce sommet a plus qu un fils dans l arbre static int numordre; static int[ ] num; static boolean[ ] articulation; static void trouverarticulations (Graphe g) { int n = gsucclength; num = new int[n]; numordre = -; articulation = new boolean[n]; for (int x = ; x < n; ++x) { num[x] = -; articulation[x] = false; for (int x = ; x < n; ++x) if (num[x] == -) { attache(g, x); static void trouverarticulations (Graphe g) { int n = gsucclength; numordre = -; num = new int[n]; articulation = new boolean[n]; for (int x = ; x < n; ++x) { num[x] = -; articulation[x] = false; for (int x = ; x < n; ++x) if (num[x] == -) { num[x] = ++numordre; int nfils = ; for (Liste ls = gsucc[x]; ls!= null; ls = lssuivant) { int y = lsval; if (num[y] == -) { ++nfils; attache(g, y); articulation[x] = nfils > ; Complexité en O(V + E)

Exercices Exercice Ecrire trouverarticulations sans variables globales Exercice Ecrire un programme qui teste la bi-connexité d un graphe Exercice (difficile) Ecrire un programme qui imprime les composantes bi-connexes Exercice Définir la notion de composante tri-connexe Exercice La commande make du système Unix fait une analyse de dépendances pour reconstruire un projet informatique Réfléchir à sa programmation Certaines versions permettent la reconstruction parallèle où plusieurs commandes peuvent s exécuter en parallèle sur p processeurs Comment adapter l analyse de dépendances?