Edges (2, k) of vertex numbers (1 to n), each once whichever its direction (sorted by their smaller vertex, then the larger).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | pairs(:,:) |
(2, k) vertex numbers, in either order |
||
| integer, | intent(in) | :: | n |
the number of vertices |
function unique_edges(pairs, n) result(edges) integer, intent(in) :: pairs(:,:) !! (2, k) vertex numbers, in either order integer, intent(in) :: n !! the number of vertices integer, allocatable :: edges(:,:) integer(int64), allocatable :: keys(:) integer :: k, m allocate(keys(size(pairs, 2))) keys = int(min(pairs(1, :), pairs(2, :)), int64) * (int(n, int64) + 1) + int(max(pairs(1, :), pairs(2, :)), int64) call sort_keys(keys) allocate(edges(2, size(keys))) m = 0 do k = 1, size(keys) if (k > 1) then if (keys(k) == keys(k - 1)) cycle end if m = m + 1 edges(:, m) = [int(keys(k) / (int(n, int64) + 1)), int(modulo(keys(k), int(n, int64) + 1))] end do edges = edges(:, 1:m) end function unique_edges