Looks like you've got the basics of an adjacency list there. I would personally use some form of dynamic container instead of a static array. Vector would probably be ideal since it should never change once everything is loaded. And from my perspective it provides a more intuitive/usable interface to your list of neighbors. eg. say you have 3 neighbors. How do you know you only have 3 neighbors with a static array. What data is contained in the other 3 elements of the array?
They are storing indices, so one could just stick -1s in there for invalid entries. (and/or they could keep a count variable)
A vector list could be used (though why, unless regions actually change?), or a dynamic array, but it's probably overkill for a non-issue. I mean, worst case scenario, where all the regions are in a straight line and only have a left/right neighbor, thats wasting 256 * 4 presumably 32-bit integers, and really, they could be using bytes if they really wanted to save memory, since they have a hardcoded 256 region limit. So, basically 1MB could be lost, but only in worst case scenarios, and thats really not all that much.
I wasn't even looking at it from a memory usage perspective, but a code readability and maintainability perspective (which are really priority one in my opinion).
In the static case, you are iterating over all the elements of the container that are NOT a specific, arbitrary value.
In the dynamic case, you are iterating over all the elements of the container.
On a side note, I wouldn't even assume that a vector implementation would use less memory, as it's entirely possible that the average capacity of each vector is as large as, or even larger than, the static array.