zoukankan      html  css  js  c++  java
  • 带权并查集模板2(银河英雄传说)

    这道题有30000个列。。。

    所以说带权并查集在原模板的基础上就必须再添一个num数组,num[i]表示i队列的长度

    算是涨了见识了。。。

    code:

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    using namespace std;
    int fa[30005],val[30005],num[30005];
    int find(int x)
    {
    	if(fa[x]!=x)
    	{
    		int t=fa[x];
    		fa[x]=find(fa[x]);
    		val[x]+=val[t]; 
    	}
    	return fa[x];
    }
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	for(int i=1;i<=30000;i++)
    	{
    		fa[i]=i;
    		num[i]=1;
    	}
    	char pd;
    	int x,y;
    	while(T--)
    	{
    		cin>>pd;
    		scanf("%d%d",&x,&y);
    		if(pd=='M')
    		{
    			int px=find(x);
    			int py=find(y);
    			if(px!=py)
    			{
    			fa[px]=py;
    			val[px]+=num[py];
    			num[py]+=num[px];
    			num[px]=0;
    			}
    			//printf("qwq
    ");
    		}
    		else
    		if(pd=='C')
    		{
    			int px=find(x);
    			int py=find(y);
    			if(px!=py)
    			{
    				printf("-1
    ");
    			}
    			else
    			{
    				int tmp;
    				tmp=abs(val[y]-val[x]);
    				printf("%d
    ",tmp-1);
    			}
    			
    		}
    	}
    	return 0;
    	
    } 
    
  • 相关阅读:
    LIS
    原根
    数三角形
    组合数问题
    最短路问题
    2020总结
    树状数组
    康托展开
    LCA
    并查集
  • 原文地址:https://www.cnblogs.com/ShineEternal/p/11265092.html
Copyright © 2011-2022 走看看