Page d'accueil Description du projet Project Description (english)
/******************************************
 *
 *   Cedric Pradalier   2001
 *   mail : http://cedric.pradalier.free.fr/mail.html  
 *
 *****************************************/
#ifndef MATCH_GRAPH_H
#define MATCH_GRAPH_H

#include <vector.h>
#include <set.h>


class MatchGraph
{
    public :
        typedef set<unsigned int,less<unsigned int> > Clique;
        typedef Clique::iterator CliqueIt;


    private :
    
        typedef set<unsigned int,less<unsigned int> > Adjacence;
        class Node {
            public :
                unsigned int id;
                Adjacence adj;
                Node() {id=0;}
                Node(unsigned int Id) {id = Id;}
                Node(const Node & n){id = n.id;adj = n.adj;}
                void init() {id=0;adj.erase(adj.begin(),adj.end());}
        };
        struct ltdeg {
            bool operator() (const Node & n1,const Node & n2)
            {
                return n1.adj.size() > n2.adj.size();
            }
        };

        typedef vector<Node> Graph;
        typedef vector< vector<bool> > GraphTable;
        typedef vector<unsigned int> vui;

        Graph internalG;
        GraphTable * gt;

        void convert();
        void GtPrint() const;

        void FindMaximalClique(Clique & clique,const vector<bool> & active);
        void FindMaximalClique(Clique & clique);

        bool isAClique(const vui & vertices,const vui & selected) const;

        
        static void RemoveLowerDegree(Graph & g,unsigned int maxRemoved,
                vector<bool> & active);
        static void initActiveSet(const vector<bool> & active,vui & v);
        static void initKlik(vui & klik,unsigned int nbElem);
        static bool decrement(vui & klik);


    public :
        MatchGraph(unsigned int nbNodes);
        MatchGraph(char * filename);

        ~MatchGraph();

        // non oriented graph. edge (j,i) is implicit
        void addEdge(unsigned int i,unsigned int j);

        Clique maximalClique();
        Clique maximumClique();
        
        void Print(bool pretty) const;
        
        unsigned int highestDegree() const;

        static void test_function(char * filename);
        static void Print(Clique & klik);
};

#endif // MATCH_GRAPH_H