마늘 손님 접 룡 (띠 권 및 템 플 릿 문제 수집)

1323 단어 데이터 구조
제목 링크:https://www.jisuanke.com/course/615/28116
제목 대의: 일련의 합병 조작 을 통 해 두 점 사이 의 거 리 를 구한다.
제목 사고방식: 우 리 는 두 장의 카드 가 같은 대열 에 있 는 지 아 닌 지 를 쉽게 통계 하고 집합 을 찾 으 면 된다.관건 은 어떻게 계산 하 느 냐 하 는 것 이다. 한 대열 에 있 는 두 개의 카드 사이 의 카드 수 는 각 카드 에서 대열 머리 까지 의 카드 수 를 유지 하면 된다.같은 대열 에 있 는 두 개의 카드 사이 의 카드 수 를 계산 할 때, 두 개의 카드 를 대열 머리 까지 의 카드 수 를 차이 나 게 하면 된다.
배 운 것: 가중 및 수집.
코드:
//        ,    

#include 
using namespace std;
const int maxn=5e6+2;
int pre[maxn];
int val[maxn];//           
int Size[maxn];//            
void build(int n)
{
    for(int i=0;i<=n;i++)
        pre[i]=i,val[i]=0,Size[i]=1;
}

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

    int y=pre[x];
    pre[x]=find(y);
    val[x]+=val[y];//x                      

    return pre[x];
}

bool join(int x,int y)
{
    int p=find(x);
    int q=find(y);
    if(p!=q){
        pre[p]=q;
        //val[q]+=val[p];
        val[p]=Size[q];//p       ,   q     
        Size[q]+=Size[p];//q        ,p       
        return true;
    }
    return false;
}
int main()
{
    int n;scanf("%d",&n);
    build(n);
    while(n--){
        char c;
        int x,y;
        cin>>c>>x>>y;
        if(c=='M'){
            join(x,y);
        }
        else{
            if(find(x)!=find(y)) cout<

좋은 웹페이지 즐겨찾기