POJ 1988

xiaoxiao2021-02-28  46

/* 如果你知道双向链表,那么这题就是和它有关; 第一步, 得出下面一堆的最上的一个方块, 得出上面一堆的最下面一个方块, 将这二方块的连起来, 第二步: 更新上面一堆中的方块的权值(经下面一堆最上面的权值为基准); 第三步: 输出:直接输出的相应的权值; */ #include <iostream> #include <fstream> #include <cstring> #include <algorithm> using namespace std; const int MAX = 100005; int root[MAX]; int dis[MAX]; int Uroot[MAX]; int Troot[MAX]; int T; int findLeft(int x){ if(Uroot[x] == x){ return x; }else{ findLeft(Uroot[x]); } } int find(int x){ if(root[x] == x){ return x; }else{ find(root[x]); } } void un(int up,int down){ root[up] = down; Uroot[down] = up; } void updata(int up, int down){ while(1){ dis[up] = dis[up] + dis[down] + 1; if(up == Uroot[up]){ break; } up = Uroot[up]; } } int main(){ freopen("a.txt", "r", stdin); scanf("%d",&T); for(int i=1; i<=T; ++i){ dis[i] = 0; Troot[i] = Uroot[i] = root[i] = i; } int a,b; for(int k=1; k<=T; ++k){ char ch; cin>>ch; if(ch == 'M'){ scanf("%d %d", &a, &b); int up = find(a); int down = find(b); if(up != down){ down = findLeft(down); un(up, down); updata(up,down); } }else{ scanf("%d", &a); printf("%d\n", dis[a]); } } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2627460.html

最新回复(0)