Algoritmos para grafos isomorfos y permutación de números en C
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void permutaciones ( int s[] , int );
void print( int s[], int n );
void swap( int *i, int *j );
int factorial( int );
int main () {
int n , r, num_comb ;
cin>>n;
cin>>r;
int j,val_max;
int s[ 6 ] , i, m;
num_comb = factorial(n) / (factorial(n-r)*factorial(r)) ;
for ( i = 1 ; i<=r ; i++ )
s[i] = i;
permutaciones( s, r );
for ( i = 2 ; i<= num_comb ; i++){
m=r;
val_max = n ;
while ( s [m] == val_max ){
// Encuentra el elemento más a la derecha
// que no tiene su valor máximo.
m= m-1;
val_max = val_max - 1 ;
}
// Se incrementa el elemento más a la derecha
s[m] = s [ m ] +1 ;
// el resto de los elementos son sucesores de X[m]
for ( j = m + 1 ; j <= r ; j++ )
s [j] = s [j-1] + 1;
permutaciones( s, r );
}
}
void permutaciones ( int s[] , int n)
{
int i, nfact, m, k, p, q;
// Copia el arreglo
int x[ 6 ] ;
for ( i=0 ; i < 6 ; i++){
x[i] = s [i] ;
}
nfact = factorial (n);
print( s, n );
for ( i = 2; i <= nfact; i++ ) {
m = n - 1;
while ( s[ m ] > s[ m + 1 ] )
m--;
k = n;
while ( s[ m ] > s[ k ] )
k--;
swap( &s[ m ], &s[ k ] );
p = m + 1;
q = n;
while ( p < q ) {
swap( &s[ p ], &s[ q ] );
p++;
q--;
}
print( s, n );
}
for ( i=0 ; i < 6 ; i++){
s[i] = x [i] ;
}
}
int factorial( int n ) {
if (n==0)
return 1;
else
return n*factorial(n-1);
}
void print( int s[], int n )
{
int i;
for ( i = 1; i <= n; i++ )
printf( "%d ", s[ i ] );
putchar( '\n' );
}
void swap( int *i, int *j )
{
int temp = *i;
*i = *j;
*j = temp;
}
Codigo
Como aprender a programar en c++ muy fácil solo tienes que tocar y tocar todo el codigo libre que encuentres y ver como funciona
No hay comentarios:
Publicar un comentario