在边线阵列中找到边线

时间:2019-01-10 17:08:57

标签: c algorithm

假设我有一个名为Edge的结构,它表示图的边缘,该结构的构造如下:

struct Edge 
{ 
    int src, dest, weight,type; 
}; 

其中edge[x].src给出边 x 的起点,edge[x].dest给出终点。

我们还假设(来源,目标)的每个组合唯一

如果我有边缘的目的地和源头,有没有一种方法可以找到这两个边缘属于哪个边缘而不必检查整个数组edge[]

边缘的初始化如下:

edge[0].src = 0; 
edge[0].dest = 1; 
edge[0].weight = 10;

edge[1].src = 0; 
edge[1].dest = 2; 
edge[1].weight = 6;

例如,如果我有 edge [x] .dest = 1`和 edge [x] .src = 0,我怎么找到x?

3 个答案:

答案 0 :(得分:2)

也许具有第二种数据结构,像这样。这里的矩阵有N * N个单元格,每个单元格都有您想要的“边缘ID”。

int matrix[MAX_NODES][MAX_NODES];
int i = 0;
int j = 0;
int k = 0;

/* matrix initialization */
for(i=0; i<MAX_NODES; i++) {
    for(j=0; j<MAX_NODES; i++) {
        matrix[i][j] = -1;
    }
}

/* edge id assing */
for(k=0; k<MAXIMUM_EDGES; i++) {
    matrix[edge[k].src][edge[k].dest] = k;
}

/* now you can get weight from matrix */
printf("edge id for src 0 and dest 1 is %d \n",matrix[0][1]);

答案 1 :(得分:1)

如果 src dest 的可能值有限,则可以使用附加向量 indexEdge ,其中indexEdge[src * N + dest]的值是 edge

中的索引

edge 中创建新条目时,必须设置 indexEdge ,如果更改edge src / dest,则必须对其进行更新

答案 2 :(得分:0)

好吧,如果您需要使边缘具有唯一性(因此图形没有方向),那么有一个简单的解决方案:

  • 使用有序对{src, dst}(每对{src, dst}元组给出一个唯一的密钥的任何顺序)生成密钥,然后将它们存储在某种哈希表中(基于键上的哈希值)或有序映射。
  • 如果您可以允许{i,j}{j,i}键有效(有向图),则在生成键时不对索引进行排序,因此对于每对节点,您有两个可能弧。但这超出了您的要求(或者至少是我从您的口语中了解的内容)。

这将允许您使用请求的键来搜索地图,并且不会导致线性搜索。对于非密集图(仅连接几对节点),它还具有较少的内存存储空间的优点。

对于无向图,如果允许自连接,则此类弧的最大数量为N*(N+1)/2,如果不允许则为N*(N-1)/2。并且对于有向图,最大数量为N^2,因此,如果该图没有密集填充,则需要使用哈希图或树图作为替代。哈希图的访问时间为O(1),树图的访问时间为O(log(n)),其中n是图中的弧总数。

将哈希表(或树图)的实际实现留作练习,或者可以轻松搜索适合该规范的实现。