Advertisement
mosaid

composantes_MC.cpp

Apr 10th, 2017
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <conio.h>
  4. #include <malloc.h>
  5. #include <iostream>
  6. #include <list>
  7. #include <stack>
  8. using namespace std;
  9.  
  10. //  Définition de la classe Classes_FC pour le calcul
  11. // de la forme canonique de la matrice de transition
  12. class Classes_FC{
  13.     public:
  14.     //Les donées  
  15.     int nbr_etats;          // Nombre d'états
  16.     int nc; //numero de la classe
  17.     float MTr[100][100];    // Matrice de transition
  18.     float MFC[100][100];    // Matrice sous form canonique
  19.     int index, indd, indf;              //Pour l'ordre de visite des sommets
  20.     list <int> *Successeurs;//Liste des successeurs
  21.     list <int> *CFC;        //Liste des classes Fortement connect
  22.     int *OFC;      //Tableau pour L'ordre des etats dans FC
  23.     int *rang;              //Tableau pour L'ordre de visite dans la recherche en profondeur
  24.     int *ret;               //Tableau pour Le plus petit retour au sommet precedent
  25.     int *Num_CFC;           //Tableau pour Le numéro de la classe Fortement connect
  26.     bool *visite;           //Tableau pour indiquer si un sommet est visité ou non
  27.     bool *dans_pile;        //Tableau pour indiquer si un sommet est dans la pile ou non
  28.     stack <int> *pile_CFC;      //variable de type pile
  29.        
  30.     //Constructeur
  31.     Classes_FC( int n );
  32.    
  33.     //**************************************
  34.     //   Méthodes de la classe
  35.     //**************************************
  36.     //Affichage de la matrice de transition
  37.     void Afficher_MTr( );
  38.     void Afficher_MFC( );
  39.    
  40.     //Lecture de la matrice de transition a partir du clavier
  41.     void lire_MTr_clavier( );
  42.  
  43.     //Lecture de la matrice de transition a partir d'un fichier
  44.     void lire_MTr_fichier(  char *nom_fichier, int n );
  45.    
  46.     // charge de la liste des successeur a partir de la matrice de transition  
  47.     void charge_liste_successeurs();
  48.    
  49.     // Affichage de la liste des successeur
  50.     void affiche_liste_successeurs();      
  51.    
  52.     //Recherche de tous les composantes FCF
  53.     void Tarjan();
  54.    
  55.     //Recherche en profondeur des CFC accessible par le sommet s0
  56.     bool DFS_Tarjan( int s0);
  57.    
  58.     void Enleve_CFC( int s0, bool Tr_s);
  59.     void Calcul_MFC();
  60. };
  61.  
  62. //*********** Constructeur ***************
  63. //   Allocation dynamique des donnees   **
  64. //****************************************
  65. Classes_FC::Classes_FC( int n ){       
  66.     nbr_etats=n;
  67.     indd=0; indf=n-1;
  68.     Successeurs = new list<int>[n];
  69.     rang= new int[n];      
  70.     OFC= new int[n];       
  71.     ret= new int[n];      
  72.     Num_CFC= new int[n];  
  73.     visite= new bool[n];  
  74.     dans_pile= new bool[n];
  75.     pile_CFC = new stack<int>();
  76. }
  77.  
  78. //****************************************************
  79. // Affichage au clavier de la matrice de transition **
  80. //****************************************************
  81. void Classes_FC::Afficher_MTr( ){
  82.     for( int i=0; i<nbr_etats; i++){
  83.         for( int j=0; j<nbr_etats; j++){
  84.             printf("%5.2f ", MTr[i][j]);
  85.         }
  86.         printf("\n");
  87.     }  
  88. }
  89.  
  90. //****************************************************
  91. // Affichage au clavier de la matrice de transition **
  92. //****************************************************
  93. void Classes_FC::Afficher_MFC( ){
  94.     for( int i=0; i<nbr_etats; i++){
  95.         for( int j=0; j<nbr_etats; j++){
  96.             printf("%5.2f ", MFC[i][j]);
  97.         }
  98.         printf("\n");
  99.     }  
  100. }
  101.  
  102. //**************************************************
  103. // Lecture au clavier de la matrice de transition **
  104. //**************************************************
  105. void Classes_FC::lire_MTr_clavier(){
  106.     for( int i=0; i<nbr_etats; i++){
  107.         for( int j=0; j<nbr_etats; j++){
  108.             printf( "entrer P(%d,%d):", i+1,j+1);
  109.             scanf("%f", &MTr[i][j]);
  110.         }
  111.     }  
  112. }
  113.  
  114. //****************************************************************
  115. // Lecture de la matrice de transition a partir d'un fichier    **
  116. //  *Les données sont sous format texte, separées par un espace **
  117. //****************************************************************
  118. void Classes_FC::lire_MTr_fichier(char *nom_fichier, int n){
  119.     FILE *p;
  120.     p=fopen(nom_fichier, "rt");
  121.     for( int i=0; i<n; i++){
  122.         for( int j=0; j<n; j++){           
  123.             fscanf(p,"%f ", &MTr[i][j]);
  124.         }
  125.         fscanf(p,"\n");
  126.     }  
  127.     fclose(p);
  128. }
  129.  
  130. //****************************************************
  131. //  Chargement de la liste des successeurs a partir **
  132. // de la matrice de transition                      **
  133. //****************************************************
  134. void Classes_FC::charge_liste_successeurs(){
  135.     for( int i=0; i<nbr_etats; i++){
  136.         for( int j=0; j<nbr_etats; j++){
  137.             if( MTr[i][j] !=0 ){
  138.                 Successeurs[i].push_back(j);
  139.             }
  140.         }
  141.     }  
  142. }
  143.  
  144. //*****************************************
  145. // Affichage de la liste des successeurs **
  146. //*****************************************
  147. void Classes_FC::affiche_liste_successeurs(){
  148.     list<int>::iterator p; //pointeur sur une liste simplement chainee
  149.     for( int i=0; i<nbr_etats; i++){
  150.         printf("Successeurs(%d)=",i);
  151.         for(  p=Successeurs[i].begin(); p!=Successeurs[i].end(); p++){
  152.             printf( "%d ", (*p+1));
  153.         }
  154.         printf("\n");
  155.     }  
  156. }
  157.  
  158. //*********************************************************
  159. // Recherche en profondeur de toutes les CFCs            **
  160. //  1. Initialisation des données                        **
  161. //  2. Parcourt des tous les sommets                     **
  162. //  3. Appel de la fonction récursif DFS_Tarjan(int s0)  **
  163. //*********************************************************
  164. void Classes_FC::Tarjan(){
  165.   // Fonction à completé
  166.   for( int i=0; i<nbr_etats; i++){
  167.     visite[i]=false;
  168.     dans_pile[i]=false;
  169.   }
  170.   index=1; nc=0;
  171.   for( int i=0; i<nbr_etats; i++){
  172.     if( visite[i] == false){
  173.         DFS_Tarjan(i);
  174.     }
  175.   }
  176.  
  177. }
  178.    
  179. //****************************************************************
  180. // Recherche en profondeur des CFCs accéssibles a partir de s0  **
  181. //  Recherche basé sur la liste des successeurs                 **
  182. //****************************************************************
  183. bool Classes_FC::DFS_Tarjan(int s0){
  184.   // Fonction à completé
  185.   rang[s0]=index; ret[s0]=index;
  186.   index++;
  187.   pile_CFC->push(s0);
  188.   bool Tr_s=false;
  189.   visite[s0]=true;
  190.   dans_pile[s0]=true;
  191.   list<int>::iterator p; //pointeur sur une liste simplement chainee
  192.   for(p=Successeurs[s0].begin(); p!=Successeurs[s0].end(); p++){
  193.     int x=*p;
  194.     if( visite[x]==false){     
  195.       bool Tr_x=DFS_Tarjan(x);
  196.       if( Tr_x==true ) Tr_s=true;
  197.       if(ret[x]<ret[s0]) ret[s0]=ret[x];
  198.     }
  199.     else if ( dans_pile[x]==true){     
  200.       if(rang[x]<ret[s0]) ret[s0]=rang[x];
  201.     }
  202.     else {  Tr_s=true; }
  203.   }  
  204.   if ( ret[s0]==rang[s0]){ Enleve_CFC(s0, Tr_s); return true; }
  205.  
  206.   return Tr_s;
  207. }
  208.  
  209. //depilement de la CFC
  210. void Classes_FC::Enleve_CFC( int s0, bool Tr_s){       
  211.      if( Tr_s ==true ) printf("\n Classe transitoire: ");
  212.      else              printf("\n Classe recurente : ");
  213.      int si;
  214.      do{
  215.       si=(int)pile_CFC->top();       
  216.       printf("%d ", si+1);
  217.       if( Tr_s ==true ){ OFC[indf]=si; indf--;}
  218.       else            { OFC[indd]=si; indd++;}
  219.       pile_CFC->pop();
  220.       Num_CFC[si]=nc;
  221.       dans_pile[si]=false;
  222.      }while( si != s0);      
  223.      nc++;
  224. }
  225. // Calcul de la matrice de transition dans
  226. // sa forme canonique à partir de l'ordre
  227. // des états (OFC[]) dans cette forme
  228. void Classes_FC::Calcul_MFC(){
  229.     for( int i=0; i<nbr_etats; i++){
  230.         for(int j=0;j<nbr_etats; j++){
  231.             MFC[i][j]=MTr[OFC[i]][OFC[j]];
  232.         }
  233.     }
  234. }
  235.    
  236. int main (){
  237.     int nbr_etats;
  238.     printf("entrer n:");
  239.     scanf("%d",&nbr_etats);
  240.     Classes_FC SCC(nbr_etats);
  241.    
  242.     //SCC.lire_MTr_clavier();
  243.     SCC.lire_MTr_fichier("test1.txt",nbr_etats );
  244.     printf(" Matrice de transition:\n");
  245.     SCC.Afficher_MTr();
  246.     SCC.charge_liste_successeurs();
  247.     //SCC.affiche_liste_successeurs();
  248.     SCC.Tarjan();
  249.     SCC.Calcul_MFC();
  250.     printf(" \n Ordre dans CF:");
  251.     for(int i=0;i<nbr_etats; i++){
  252.         printf("%d ", SCC.OFC[i]+1);
  253.     }
  254. //  printf(" \n indd=%d  et indf=%d\n", SCC.indd, SCC.indf);
  255.     printf(" \nMatrice de transition sous forme canonique:\n");
  256.     SCC.Afficher_MFC();
  257.     //SCC.Tarjan();
  258.    
  259.    
  260.    
  261.     getch();
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement