Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Algoritmo de Kruskal com selection sort
- */
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- #define fori(i, b, n) for(int i = b; i<n; ++i)
- using namespace std;
- struct aresta{
- int v1;
- int v2;
- int peso;
- };
- //vetor utilizado para a detecçao de ciclos tamanho é a quantidade maxima de vertices
- int ciclo[62816];
- //detectar ciclos
- void unir(int v1, int v2);
- int pai(int x);
- //ordenar as arestas pelo peso
- void insertionSort( aresta *A, int tamanhoVetor );
- int main (){
- int n, m;
- scanf("%d %d", &n, &m); //lendo os vertices e as arestas
- //vetor para armazenar as arestas:
- aresta arestas[m];
- //iniciando o vetor de ciclos
- fori(i, 0, n){ //se os vertices forem numerados de 0 a n colocar n+1 no lugar de n
- ciclo[i] = i;
- }
- //lendo e armazenando as arestas
- fori(i, 0, m){
- scanf("%d %d %d", &arestas[i].v1, &arestas[i].v2, &arestas[i].peso);
- }
- //ordenando pelo peso
- insertionSort(arestas, m);
- //kruskal, percorre todas as arestas
- fori(i, 0, m){
- //detectando se com esta aresta forma ciclo:
- if ( pai(arestas[i].v1) != pai(arestas[i].v2) ){
- //imprimindo a aresta que está na arvore geradora minima em ordem crescente de vertices
- if(arestas[i].v1 < arestas[i].v2){
- printf("%d %d\n", arestas[i].v1, arestas[i].v2);
- }
- else{
- printf("%d %d\n", arestas[i].v2, arestas[i].v1);
- }
- unir(arestas[i].v1, arestas[i].v2);
- }
- }
- printf("\n");
- }
- void unir(int v1, int v2){
- ciclo[pai(v1)] = pai(v2);
- }
- int pai(int v){
- if (ciclo[v] == v){
- return v;
- }
- ciclo[v] = pai(ciclo[v]);
- return ciclo[v];
- }
- void insertionSort( aresta *A, int tamanhoVetor ){
- //valor maximo do peso
- aresta peso[62816];
- //declarando o tempo
- clock_t Ticks[2];
- Ticks[0] = clock();
- int i, j=0;
- aresta aux;
- for(i=0; i<(tamanhoVetor - 1); i++){
- int menor = i;
- for(j=(i+1); j<tamanhoVetor; j++){
- if(strcmp( peso[menor] > peso[j]) == 0){
- menor = j;
- }
- }
- aux = peso[menor];
- peso[menor] = peso[i];
- peso[i] = aux;
- }
- //calculando o tempo da ordenação
- Ticks[1] = clock();
- double Tempo = (Ticks[1] - Ticks[0]) * 1000.0 / CLOCKS_PER_SEC;
- printf("Tempo gasto: %g ms.", Tempo);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement