求助!!!DEBUG时遇到了一个无法理解的错误!!!
  • 板块P2078 朋友
  • 楼主fcy20180201
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/6/29 21:50
  • 上次更新2023/11/3 12:06:59
查看原帖
求助!!!DEBUG时遇到了一个无法理解的错误!!!
866154
fcy20180201楼主2023/6/29 21:50

这道题一直是10分(代码在最下面),所以我下载了样例2的数据。

我的程序很明显将两个公司的人分别并查集,并将所有编号都增加10000以避免负数。

在公司1并查集合并时,我一直将编号1(即程序中的10001)放在祖先的位置(第21行),但用样例2 DEBUG 时却发现编号1的祖先在输入第73行(8303 2675)时变成了编号2675,且编号8303和2675在当时都是首次出现,也就是说8303和2675在那之前是和别的节点没有任何联系的(包括1),所以1的祖先是怎么变的?!!

求助大佬!!!

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int n,m,p,q,f[20005],x,y,t;

int ff(int g){
	if(f[g]==g)return g;
	return f[g]=ff(f[g]);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>p>>q;
	for(int i=0;i<=10000+m;i++)f[i]=i;
	while(p--){
		int u,v;cin>>u>>v;
		u+=10000,v+=10000;
		if(u>v)swap(u,v);
		f[ff(v)]=ff(u);
		/*if(u==18303 || v==18303){
			cout<<f[10001]<<endl;
			system("pause");
		}*/
	}
	while(q--){
		int u,v;cin>>u>>v;
		u+=10000,v+=10000;
		if(u<v)swap(u,v);
		f[ff(v)]=ff(u);
		//if(ff(9999)!=9999)system("pause");
	}
	for(int i=10000-n;i<10000;i++){
		//cout<<ff(i)<<' ';
		if(ff(i)==9999)x++;
	}
	cout<<endl;
	for(int i=10001;i<=10000+m;i++){
		//cout<<ff(i)<<' ';
		if(ff(i)==10001)y++;
	}
	//cout<<endl;
	cout<<min(x,y);
	return 0;
}
2023/6/29 21:50
加载中...