shackerist 2021-03-07 20:46 采纳率: 80%
浏览 25
已采纳

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条回答 默认 最新

  • 对象被抛出 2021-03-07 21:13
    关注

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

    scanf_s("%c %d %d", &op, 1, &x, &y);
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
  • ¥30 matlab解优化问题代码
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?