File: bfs.c

package info (click to toggle)
graphviz 14.0.5-2
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 139,388 kB
  • sloc: ansic: 141,938; cpp: 11,957; python: 7,766; makefile: 4,043; yacc: 3,030; xml: 2,972; tcl: 2,495; sh: 1,388; objc: 1,159; java: 560; lex: 423; perl: 243; awk: 156; pascal: 139; php: 58; ruby: 49; cs: 31; sed: 1
file content (54 lines) | stat: -rw-r--r-- 1,765 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*************************************************************************
 * Copyright (c) 2011 AT&T Intellectual Property
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors: Details at https://graphviz.org
 *************************************************************************/

/******************************************

        Breadth First Search
        Computes single-source distances for
        unweighted graphs

******************************************/

#include <neatogen/bfs.h>
#include <util/list.h>

void bfs(int vertex, vtx_data *graph, int n, DistType *dist) {
  DistType closestDist = INT_MAX;

  // initial distances with edge weights
  for (int i = 0; i < n; i++)
    dist[i] = -1;
  dist[vertex] = 0;

  LIST(int) Q = {0};
  LIST_PUSH_BACK(&Q, vertex);

  while (!LIST_IS_EMPTY(&Q)) {
    const int closestVertex = LIST_POP_FRONT(&Q);
    closestDist = dist[closestVertex];
    for (size_t i = 1; i < graph[closestVertex].nedges; i++) {
      const int neighbor = graph[closestVertex].edges[i];
      if (dist[neighbor] < -0.5) { // first time to reach neighbor
        const DistType bump = graph[0].ewgts == NULL
                                  ? 1
                                  : (DistType)graph[closestVertex].ewgts[i];
        dist[neighbor] = closestDist + bump;
        LIST_PUSH_BACK(&Q, neighbor);
      }
    }
  }

  // for dealing with disconnected graphs
  for (int i = 0; i < n; i++)
    if (dist[i] < -0.5) // `i` is not connected to `vertex`
      dist[i] = closestDist + 10;

  LIST_FREE(&Q);
}