Anda di halaman 1dari 17

Grafos

Pablo San Segundo (C-206)


pablo.sansegundo@upm.es

Grafos
`

Modelo relacional
`

Conjunto de vrtices (V) y aristas entre los vrtices (E)

Simples o estrictos ( E VxV )


`
`
`
`

No dirigidos vs. dirigidos (digrafos)


Etiquetados (con pesos)
Componentes conexos
rboles
`
`

Conexo
Acclico

Bosques (conjunto de rboles)

No estrictos
`
`

Mltiples aristas entre dos vrtices


Otros

Grafos simples no dirigidos


`
`

N vrtices (|V|=N) y M aristas (|E|=M)


Grado de un vrtice ( (v) )
`

Grado de un grafo (G )
`

Nmero de aristas incidentes con dicho vrtice

Mayor grado de cualquiera de sus vrtices

Densidad

M
p=
N ( N 1)
2

CARDINALIDADES
`
`

Nmero mximo de aristas con N vrtices?


Nmero mximo de configuraciones con N vrtices?

Estructuras de datos para grafos simples


MATRIZ DE ADYACENCIAS
3

2
4
1
5

x 1 0 1 1 1

x
1
1
1
0

x 0 0 0

x 1 0

x 1

Grafo simple no dirigido y sin pesos: Matriz simtrica y binaria

Herram. para compilacin multiplataforma


make

cmake

CMakeLists.txt

MakeFile

Binarios

cmake_minimum_required(VERSION 2.8)
PROJECT(CICLOS)
ADD_LIBRARY(common

xxx.cpp .)

ADD_EXECUTABLE(test test.cpp)
IF(WIN32)
TARGET_LINK_LIBRARIES(test common)
ELSE(WIN32)
TARGET_LINK_LIBRARIES(test common pthread)
ENDIF(WIN32)

Standard Template Libraries


`

Vectores
`
`
`
`
`
`

#include <vector>
push_back () y pop()
Iteradores
Sobrecarga []
clear()
erase()

Sets
`
`
`
`
`

#include <set>
insert()
Iteradores
clear()
erase()

SET {8, 10 y 12}


#include <stdio.h>
#include <vector>
#include <set>
#include <iostream>
using namespace std;
int main(void)
{
printf("Hola mundo\n");
set<int> myset;
myset.insert(8);
myset.insert(10);
myset.insert(12);
set<int>::iterator it;
for (it=myset.begin(); it!=myset.end(); it++){
cout<<(*it)<<endl;
}
return 0;
}

Codificacin de matriz de adyacencias


`

Matriz de enteros (o char):


`

int ** matrix

Operadores C++ new y delete


int main(void){
const int N=2;
int** matrix= new int*[N];
for(int i=0; i<N; i++){
matrix[i]= new int[N];
}
//Rellenar la matriz

matrix[0][0]=0;
//...
//Borrar

for(int i=0; i<N; i++){


delete [] matrix[i];
}
delete [] matrix;
matrix=NULL;
return 0;
}

Codificacin de matriz de adyacencias


`

Vector de enteros (o char):

vector <vector<int> >

int main(void)
{
vector< vector<int> > matrix;
vector<int> myv;
myv.push_back(0);
myv.push_back(1);
matrix.push_back(myv);
myv.clear();
myv.push_back(1);
myv.push_back(0);
matrix.push_back(myv);
for(unsigned int i=0; i<matrix.size(); i++){
for(unsigned int j=0; j<matrix[i].size(); j++){
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
return 0;
}

Codificacin de lista de vrtices


`

Set de enteros : set<int>


Lista de vrtices adyacentes a V1

2
4

int main(void)
{
//Vertices adyacentes a V1
set<int> myset;
myset.insert(2);
myset.insert(4);
myset.insert(5);
myset.insert(6);

mysert.insert(2);

//???

5
return 0;
}
6

El contenedor asociativo SET no almacena


elementos iguales

Ejercicio

2
4
1
5

Implemente un programa que calcule


el grado del grafo de la figura.
Codifique la matriz de adyacencias
como un vector bidmensional de
enteros

Clase Graph
`

Datos miembros
`
`

m_N: Nmero de vrtices del grafo


int ** m_graph: Matriz de adyacencias

Funciones miembro
`
`
`
`

NewGraph (int N);


DeleteGraph();
Setters and Getters
WriteGraphSimpleFormat( char* filename)

EJERCICIOS
Funcin miembro para
calcular el grado del grafo

Funcin miembro para calcular el


nmero de aristas del grafo

Grado del grafo


`

Mximo grado de cualquiera de sus vrtices


`

Algoritmo de optimizacin
int Graph::GraphDegree()
{
int temp, graph_deg=0;
for(int i=0; i<m_N;i++)
{
temp=0;
for(int j=0; j<m_N; j++){
(m_graph[i][j])? temp++ : 1;
}
//Maximizacin

if(temp>graph_deg)
graph_deg=temp;
}
return graph_deg;
}

Nmero de aristas del grafo


`

Contaje del nmero de 1s de la matriz de adyacencia

int Graph::NumberOfEdges ()
{
int nEdges=0;
for(int i=0; i<m_N-1; i++)
for(int j=i+1; j<m_N; j++)
if(m_graph[i][j]==1)
nEdges++;
return nEdges;
}

ATENCIN A LOS LMITES DE LOS BUCLES ANIDADOS

Streams (STL)

#include <iostream>: cout, cin


#include <sstream> : stringstream, <o/i>stringstream,
#include <fstream>: fstream, ofstream, ifstream
#include <string>: string

EJERCICIOS

`
`
`

Leer de un fichero dosdatos.txt dos nmeros

Escribir Hola en el fichero log.txt


ifstream f(dosdatos.txt,ios::in);
if(!f){
cout<<"error "<<endl;
return -1;
}

ofstream f(log.txt,ios::iout)
if(!f){
cout<<"error "<<endl;
return -1;
}

//Leer

//Escribir

f.close();

f.close();

Streams (STL)
`

EJERCICIOS
`

Formateo de una cadena en memoria


stringstream sstr ;
int num =3;
sstr<< Num: <<num<<Num*Num: <<nuim*num;
cout<sstr.str().c_str()<<endl;

Objeto string
string str ;
str = hola + + adios;
If (str.find(hola)==string::npos){
cout<<cadena no encontrada<<endl;
}

Operador texto
class graph {
friend ostream & operator << (ostream & , const Graph& );
}

Streams: Lectura de un grafo por fichero


`
`

Formato DIMACS
Formato SGF (simple graph format)
SGF
c tamao 9, aristas 14
c Bosque con dos arboles y
c un ciclo en el segundo
p9
010000000
101000000
010100000
001010000
000101000
000010000
000000011
000000101
000000110

DIMACS
c File: johnson8-2-4.clq
c
c Source: Panos Pardalos
c pardalos@math.ufl.edu
p edge 28 210
e43
e52
e61
e73
e75
e76
e82
e84
e86
//

Paso de argumentos a un proceso


argc: nmero
de parmetros

argv: tabla de
parmetros

#include <iostream>
using namespace std;
int main (int argc, char** argv )
{
if(argc>1){
for(int i=1; i<=argc; i++){
cout<<"param: "<<i<<" es "<<argv[i]<<endl;
}
}
}

Anda mungkin juga menyukai