一家人解决方法

一家人
/*给N个人之间的M条关系。询问Q次某两人是不是一家人(即这两个人可不可以通过若干关系相联系)。

输入
第一行是三个自然数N,M,Q(均不超过100)。接下来M行,每行两个数,表示这两个编号代表的人之间有关系。在接下来Q行,
每行两个书,询问这两个编号代表的人是不是一家人。
输出
对于每个询问输出一行,如果是一家人,输出"Yes",否则输出"No"。
样例输入
3 1 2
1 2
1 2
1 3
样例输出
Yes
No
*/


那位算法高手指点一下或者给一下这题的代码呗?、谢谢了

------解决方案--------------------

#include <stdio.h>

int main(void)
{
int   N, M, Q;
int   p, i, j, a, b;
/* 用二维表来表示a和b之间的关系,0表示没有关系,1表示有关系 */
int   buf[100][100] = {0};

scanf("%d%d%d", &N, &M, &Q);
for (p = 0; p < M; p++) {
scanf("%d%d", &a, &b);
/* a和b有关系,则b和a也有关系 */
buf[a-1][b-1] = 1;
buf[b-1][a-1] = 1;
/* 对于每次输入,检测a和b与其他人的关系 */
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
/* 检测a行关系 */ 
if (buf[a-1][i] == 1 && buf[a-1][j] == 1)
buf[i][j] = 1;
/* 检测b行关系 */ 
if (buf[b-1][i] == 1 && buf[b-1][j] == 1)
buf[i][j] = 1;
}
}
}

for (p = 0; p < Q; p++) {
scanf("%d%d", &a, &b);
if (buf[a-1][b-1])
printf("Yes\n");
else
printf("No\n");
}

return 0;
}

/*
输出结果:
3 1 2
1 2
1 2
Yes
1 3
No
*/