#include <stdio.h> #include <stdlib.h> #include <time.h> #include "algrafo.h" #include "RQ.h" /* Funções Lista - Ligada */ node NovaLista() { return NULL; } node AddLista(node lista, int item) { node a = malloc(sizeof*a); a->num = item; a->next = lista; return a; } int BuscaLista(node lista, int item) { while(lista) { if(item==lista->num) return 1; lista = lista->next; } return 0; } node RemoveLista(node lista, int item) { node a; if(lista==NULL) return NULL; if(item==lista->num) { a = lista->next; free(lista); return RemoveLista(a,item); } lista->next = RemoveLista(lista->next, item); return lista; } void DestroiLista(node lista) { node a; while(lista) { a = lista->next; free(lista); lista=a; } } void ImprimeLista(node lista) { while(lista) { printf("[%d]",lista->num); lista = lista->next; } printf("\n"); } /* fim das funcoes de Lista Ligada */ node* Listagem(int a); int* Graus(int a, int valor); Graph GRAPHinit(int a) { Graph b = malloc(sizeof*b); b->V = a; b->E = 0; b->listas = Listagem(a); return b; } Edge EDGE(int a, int b) { Edge c; c.v = a; c.w = b; return c; } void GRAPHinsertE(Graph a, Edge b) { /* if(BuscaLista(a->listas[b.w], b.v) || b.w == b.v) return;*/ (a->E)++; a->listas[b.v] = AddLista(a->listas[b.v], b.w); a->listas[b.w] = AddLista(a->listas[b.w], b.v); } void GRAPHremoveE(Graph a, Edge b) { if(BuscaLista(a->listas[b.v], b.w)) { a->listas[b.v] = RemoveLista(a->listas[b.v], b.w); a->listas[b.w] = RemoveLista(a->listas[b.w], b.v); (a->E)--; } } void GRAPHdestroy(Graph a) { int i; for(i=0;i<a->V;i++) { DestroiLista(a->listas[i]); } free(a->listas); free(a); } void GRAPHshow(Graph g) { int b; printf("[%d Arestas, %d Vertices]\n",g->E, g->V); for(b=0;b<g->V;b++) { printf("%d: ",b); ImprimeLista(g->listas[b]); } } Graph GRAPHrand(int V, int E) { Edge arr; Graph a = GRAPHinit(V); while(a->E<E) { arr.w = rand()%V; arr.v = rand()%V; fflush(NULL); GRAPHinsertE(a, arr); } return a; } Graph GRAPHscan(int V, int E) { Edge arr; int i; Graph a = GRAPHinit(V); for(i=0;i<E;i++) { scanf("%d %d", &arr.v, &arr.w); GRAPHinsertE(a, arr); } return a; } node* Listagem(int a) { node* n; int i; n = malloc(a*sizeof(node*)); for(i=0;i<a;i++) n[i]=NULL; return n; } int *h, hMax; void rfs(Graph G, Edge e) { node t; int v; RQput(e); while(!RQEmpty()) if(h[(e=RQget()).w] == -1) { h[e.w] = h[e.v]+1; if(hMax < h[e.w]) hMax = h[e.w]; for(t=G->listas[e.w]; t!=NULL; t=t->next) { if(h[v=t->num] == -1) RQput(EDGE(e.w,v)); } } } int EPbla(Graph g) { int i; h = malloc(g->V*(sizeof*h)); hMax = 0; RQInit((int)((double)g->V*g->V + 1)/4.0); for(i=0;i<g->V;i++) h[i]=-1; rfs(g,EDGE(0,0)); free(h); return hMax; } Graph GRAPHcompleto(int V) { int i; node no; Graph g = GRAPHinit(V); no = NovaLista(); for(i=0;i<V;i++) no = AddLista(no, i); for(i=0;i<V;i++) g->listas[i]=no; return g; }