Estou estudando grafos para a prova da OBI e decidi estudar os códigos e a lógica através de códigos já pronto;
O problema a ser resolvido está no seguinte endereço: http://olimpiada.ic.unicamp.br/pratique/programacao/nivel2/2009f1p2_pontes O código é esse (solução proposta pela própria OBI):
/* Solucao para o problema "Caminho das Pontes" da OBI 2009 por: Igor Ribeiro de Assis */#include <stdio.h>#include <string.h> /* memset() */#define MAXN 1010/* matriz de adjacencias */int A[MAXN][MAXN], visitado[MAXN], dis[MAXN];int n, m;int dijkstra() { int i; memset(dis, 0x3f, sizeof(dis)); /* distancia inicial infinita */ memset(visitado, 0, sizeof(visitado)); dis[0] = 0; for (; { int no = -1; for (i = 0; i < n; i++) if (!visitado[i] && (no == -1 || dis[i] < dis[no])) no = i; if (no == -1) break; visitado[no] = 1; for (i = 0; i < n; i++) if (dis[no] + A[no][i] < dis[i]) dis[i] = dis[no] + A[no][i]; } return dis[n-1];}int main() { int i; int s, t, b; scanf("%d%d", &n, &m); n += 2; /* imagina os as bordas como pilares */ memset(A, 0x3f, sizeof(A)); /* numero de buracos infinito */ for (i = 0; i < m; i++) { scanf("%d%d%d", &s, &t, &; A[s][t] = A[t][s] = b; } printf("%d\n", dijkstra()); return 0;}
O que entendi desse código foi:
O grafo está sendo representado por matriz de adjacência;
Como o grafo é ponderado, para identificar os arcos está sendo utilizado o próprio peso da aresta;
Foi criado um vetor para a distância mínima;
Foi criado um vetor para marcar as visitadas ( não sei como);
A saída da função dijkstra() é a distância mínima percorrida, no caso a quantidade mínima de buracos;
A função memset() preenche um array com determinado valor;
Mas não entendi poruqe preenche o vetor dis[] com 0x3f. Tinha pesquisado e descobri que é 63 em número hexadecimal, mas por que 63 e por que em número hexadecimal?
O que significa os ';;' em "for (; {"?
Vocês poderiam me descrver como funciona a lógica dentro do for(;{}? Quando pesquisei sobre grafos não entendi como funciona aqueles visitados e não visitados...