求大佬帮帮忙a
查看原帖
求大佬帮帮忙a
307483
苏黎世楼主2020/11/4 18:39

哪位可以看一下,为什么会爆0啊

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 3e4 + 5;
int T;
struct ufs
{
    int f[maxn], dis[maxn], size[maxn];
//dis存节点x到父节点f[x]之间的边权
//size是集合的大小 
    ufs()
    {
        for(int i = 0;i <= maxn; ++i)
        {
        	f[i] = i;
        	dis[i] = 1;
        	size[i] = 0;
        }
          
    }

    int get(int x)//按秩合并 
    {
    	if(f[x] == x)
    	  return x;

		int fa = f[x];
		f[x] = get(f[x]);
		dis[x] += dis[fa];
		size[x] = size[f[x]];
		
		return f[x] ;
    }

    void uni(int x, int y)
    {
        x = get(x); y = get(y);
        if(x == y)
          return;
			f[x] = y;
        dis[x] = size[y];
        size[y] += size[x];
        size[x] = size[y];
    }

    bool ask(int x, int y)
    {
        return get(x) == get(y);
    }
};
ufs bin;

int main()
{
    cin >> T;
    char fl;
    int p, q;
    while(T--)
    {
        cin >> fl >> p >> q;

        if(fl == 'M')//连接 
            bin.uni(p, q);
        else
        {
        	if(!bin.ask(p, q))
		      puts("-1");
			else
		      cout << abs(bin.dis[p] - bin.dis[q]) - 1<< endl;
        }
		  
    }
    return 0;
}
2020/11/4 18:39
加载中...