Problème de mise en œuvre de la graph_coloring - m coloration problème

Je dois écrire un programme C++, ce qui permettra de déterminer combien de couleurs que je devrais utiliser de la couleur de graphes non orientés.

Aussi, je dois le faire à l'aide de l'algorithme du livre "les Fondations d'Algorithmes à l'aide de C++ pseudo-code".

Description du problème: Déterminer toutes les façons dans lequel les sommets dans un graphe non-dirigé peut être de couleur, en utilisant uniquement des m couleurs, de sorte que les sommets adjacents ne sont pas de la même couleur.

D'entrée: entiers positifs n et m, et un graphe non-dirigé contenant n sommets. Le graphique est représenté par un tableau à deux dimensions W, qui a à la fois de ses lignes et de colonnes indexées de 1 à n, où W [i] [j] est vrai si il existe une arête entre i-ème sommet et la j-ème sommet et false sinon.

De sortie: possible toutes les couleurs du graphique, à l'aide d'au plus m couleurs, de sorte que deux sommets adjacents sont de la même couleur. La sortie de chaque coloriage est un tableau vcolor indexés de 1 à n, où vcolor [i] est la couleur (un entier compris entre 1 et m) affectés à la i-ème sommet.

Là, nous avons algorithme:

void m_coloring (index i)
{
    int color;
    if (promising (i))
        if (i == n)
            cout << vcolor [1] through vcolor [n];
        else
            for (color = 1; color <= m; color++){ //Try every
                vcolor [i + 1] = color;           //color for
                m_coloring (i + 1);               //next vertex.
            }
}

bool promising (index i)
{
    index j;
    bool switch;

    switch = true;
    j = 1;
    while (j && switch){                       //Check if an
        if (W[i][j] && vcolor[i] == vcolor[j]) //adjacent vertex
            switch = false;                    //is already
        j++;                                   //this color.
    }
    return switch;
}

Et commentaire à la fin: à la Suite de notre convention habituelle, n, m, W, et vcolor ne sont pas entrées, soit de routine. Dans une implémentation de l'algorithme, les routines seront définies localement dans une procédure simple qui a n, m, W et que des entrées, et vcolor définis localement. Le haut niveau de l'appel à m_coloring serait m_coloring( 0 )

Je commence à écrire ma propre mise en œuvre. Tout d'abord je tiens à dire que je ne suis pas bon programmeur C++, ce qui est plus, j'ai l'habitude d'utiliser JS et PHP, faiblement typé langues, donc je suis sûr qu'il ya beaucoup de choses que je pourrais faire mieux. Mais ce n'est pas le principal problème.

Problème est: le programme ci-dessus de commencer à travailler, j'écris graphique simple:

4 points, 4 bords

1 2

1 3
2 3
3 4

Prochaine, programme de commencer à utiliser checkFor() (j'ai prévu de l'utiliser pour() de chaque côté nombre de couleurs, mais à des fins de test, je l'utilise au statique, alors je l'ai utilisé 4.

Malheureusement, le lancement d'un programme m_coloring(), à côté de lancement prometteur() et... c'est la fin. - Je passer les trois dernières heures pour savoir, ce que je fais mal, peut-être plus du tout programmeur expérimenté est en mesure de m'expliquer ce que je dois faire et /ou ce que je fais mal...

Moyens aider, je vous remercie beaucoup.

Mon code de programme:

#include <iostream>
using namespace std;
bool **W;
int n, m = 0;
int v, e = 0;
int x, y = 0;
int *vcolor;
bool promising (int i)
{
int j = 1;
bool switcher = true;
while (j && switcher)
{   
if ( W[i][j] && vcolor[i] == vcolor[j] )
{
switcher = false;
}
j++;
}
return switcher;
}
void m_coloring (int i)
{
int color;
if ( promising (i) )
{
if (i == n)
{
cout << vcolor [1] << " through " << vcolor [n];
}
else
{
for (color = 1; color <= m; color++)
{      
vcolor [i + 1] = color;
m_coloring(i + 1);
}
}
}
}
void initArrays()
{
for( int i = 0; i < n; i++ )
{
W[ i ] = new bool[ n ];
vcolor[ i ] = 0;
}
}
void fillW()
{
for( int i = 0; i < n; i++ )
{
for( int j = 0; j < n; j++ )
{
if( !W[i][j] )
{
W[i][j] = false;
}
}
}
}
void askForEdges()
{
cout << "How many edges? ";
cin >> e;
cout << endl << "Write edges with pattern: [vertex_x][space][vertex_y]:" << endl;
for( int i = 0; i < e; i++ )
{
cin >> x >> y;
W[x][y] = true;
W[y][x] = true;
}
}
void specialMatrixPrint()
{
cout << endl;
int i, j;
for( i = 0; i < n; i++ )
{
for( int j = 0; j < n; j++ )
{
cout << W[i][j] << " ";
}
cout << endl;
}
}
void showEdgesMatrix()
{
int i, j = 0;
cout << endl << "    "; for( i = 1; i < n; i++ ) { cout << i << " "; } cout << endl;
cout << endl << "    "; for( i = 1; i < n; i++ ) { cout << "# "; } cout << endl;
for( i = 1; i < n; i++ )
{
cout << i << " # ";
for( int j = 1; j < n; j++ )
{
if( W[i][j] == true ) { cout << "1 "; }
else { cout << "0 "; }
}
cout << endl;
}
}
void showVcolor()
{
cout << endl;
for( int i = 1; i < n; i++ )
{
cout << i << ": " << vcolor[ i ] << endl;
}
}
void checkFor( int i )
{
m = i;
m_coloring( 0 );
}
int main()
{
cout << "How many vertexes? " ;
cin >> n;
n += 1;
W = new bool *[ n ];
vcolor = new int[ n ];
initArrays();
askForEdges();
showEdgesMatrix();
checkFor( 4 );
showVcolor();
cin >> y;
return 0;
}
  • Il n'y a pas de vérification des limites dans promising.
  • Ok, j'ai vu cela avant, mais, quand j'ai mis la vérification des limites: while (j && switcher) { if( j < k ) if ( W[i][j] && vcolor[i] == vcolor[j] ) { switcher = false; } j++; } else { switcher = false; } } programme encore ne rien faire. J'ai aussi mis la vérification des limites pour: m_coloring( i + 1 ) if( !i + 1 < n ) ça n'aide pas...
InformationsquelleAutor rude boy | 2011-05-30