C语言两跳邻居查询问题:如何排除当前顶点?
解决两跳邻居查询包含自身顶点的问题
嘿,我看你遇到的问题是两跳邻居查询结果里混进了当前查询的顶点本身,这个小问题其实挺好修正的,咱们来一步步捋清楚~
问题根源
你的代码大概率是在遍历两跳节点的过程中,没有主动排除查询的顶点本身。举个例子:当某个一跳邻居和查询顶点之间有双向边时(比如顶点0的一跳邻居是1,而1的邻居又包含0),如果没做过滤,就会把0自己也加到两跳结果里。另外,如果你的邻接矩阵里不小心给顶点自己加了自环(G[x][x]=1),也会出现这个问题。
修正后的代码示例
基于你的代码框架,我调整了逻辑,加入了顶点过滤和重复去重的处理:
#include<stdio.h> #include<stdlib.h> #define M 20 #define N 20 int main() { int i, j, k, x; // 初始化邻接矩阵(这里是示例图,你可以替换成自己的图数据) int G[20][20] = { {0} }; G[0][1] = 1; G[1][0] = 1; G[1][2] = 1; G[2][1] = 1; G[0][3] = 1; G[3][0] = 1; G[3][2] = 1; G[2][3] = 1; printf("请输入要查询的顶点:"); scanf("%d", &x); // 标记数组:1表示是两跳邻居或自身,0表示不是 int is_two_hop[20] = {0}; is_two_hop[x] = 1; // 先标记自身,后续直接排除 // 第一步:遍历所有一跳邻居 for (j = 0; j < N; j++) { if (G[x][j] == 1) { // j是x的直接邻居(一跳) // 第二步:遍历j的所有邻居,这些是两跳候选 for (k = 0; k < N; k++) { // 只添加未标记过的节点(避免重复+排除自身) if (G[j][k] == 1 && !is_two_hop[k]) { is_two_hop[k] = 1; } } } } // 输出结果:只打印标记为1且不是自身的节点 printf("vertex %d 的两跳邻居:", x); for (i = 0; i < N; i++) { if (is_two_hop[i] == 1 && i != x) { printf("%d ", i); } } printf("\n"); return 0; }
关键修正点
- 提前标记自身:用
is_two_hop[x] = 1把查询顶点先标记,这样在遍历两跳候选时直接跳过它。 - 去重+过滤:通过标记数组避免同一个两跳邻居被重复添加,同时输出时再次判断
i != x做双重保险。 - 逻辑清晰分层:先找一跳邻居,再遍历一跳邻居的邻居,严格区分开一跳和两跳的范围。
如果你的原始邻接矩阵初始化逻辑不同,只需要把示例里的图数据替换成你自己的就行,核心的过滤逻辑是通用的~
内容的提问来源于stack exchange,提问作者mugglepot
相关产品推荐
相关产品推荐

