qq_17591789
shackerist
采纳率75%
2021-03-07 20:46

c语言写一道并查集的题目,发生访问冲突

已采纳

题目描述
一共有n个数,编号是1~n,最开始每个数各自在一个集合中。

现在要进行m个操作,操作共有两种:

“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
“Q a b”,询问编号为a和b的两个数是否在同

一个集合中;
输入格式
第一行输入整数n和m。

接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。

输出格式
对于每个询问指令”Q a b”,都要输出一个结果,如果a和b在同一集合内,则输出“Yes”,否则输出“No”。

每个结果占一行。

数据范围
1≤n,m≤105

代码如下

​
#include <stdio.h>
#include <stdlib.h>

int find(int x);
void match(int x, int y);
void question(int x, int y);
int pre[5];
int main()
{
	
	int i;
	int n = 5;
	int m = 5;
	int x, y;
	for (i = 1; i <= n; i++) {
		pre[i] = i;
	}
	while (m--) {
		char op;
		scanf_s("%c %d %d", &op, &x, &y);
		if (op == 'M') {
			match(x, y);
		}
		if (op == 'Q') {
			question(x, y);
		}
	}
	return 0;
}

int find(int x)
{
	if (pre[x] != x) {
		int t = find(pre[x]);
		pre[x] = t;
	}
	return pre[x];
}

void match(int x, int y)
{
	if (pre[x] != y) {
		pre[x] = y;
	}
}

void question(int x, int y)
{
	int fx = find(x);
	int fy = find(y);
	if (fx == fy) {
		printf("Yes");
	}
	else {
		printf("No");
	}
}

​

问题如下

请问各位大佬,这里为什么出现访问异常了?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • weixin_43848827 对象被抛出 1月前

    scanf_s在读取字符的时候需要传入一个和参数有关的大小值,避免引用到不存在的元素.写成下面这样就行

    scanf_s("%c %d %d", &op, 1, &x, &y);
    点赞 1 评论 复制链接分享