P1196 ssl1225-银河英雄传说【图论,并查集】
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                P1196  ssl1225-银河英雄传说【图论,并查集】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                正題
題目鏈接: 
 https://www.luogu.org/problemnew/show/P1196
大意
有30000列和30000個飛船,開始時i號飛船在i列上。有兩種操作: 
 (1)將x所在的列上的所有飛船連接在y號飛船所在的列上 
 (2)詢問x號飛船與y號飛船之間相隔幾個飛船
解題思路
用兩個數組分別儲存離它祖先的距離和后面的飛船數量(包括上自己)。然后在尋找祖先壓縮路線時重新計算離他祖先的距離,然后用前綴和求相隔的飛船數。
代碼
#include<cstdio> using namespace std; int father[30001],behind[30001],front[30001]; int n,q,x,y; char c; int abs(int x) {if (x<0) return -x;else return x; } int find(int x) {if (father[x]==x) return x;int lf=find(father[x]);front[x]+=front[father[x]];//下傳標記return father[x]=lf; }//尋找祖先 int unionn(int x,int y) {int fa=find(x),fb=find(y);father[fa]=fb;front[fa]=behind[fb];behind[fb]+=behind[fa]; }//連接兩點 int main() {scanf("%d",&q);n=30000;for (int i=1;i<=n;i++){father[i]=i;front[i]=0;behind[i]=1;}//初始化for (int i=1;i<=q;i++){scanf("\n%c %d %d",&c,&x,&y);if (c=='M'){unionn(x,y);//連接}if (c=='C'){if (find(x)!=find(y)) printf("-1\n");else{printf("%d\n",abs(front[x]-front[y])-1);//輸出}}} }總結
以上是生活随笔為你收集整理的P1196 ssl1225-银河英雄传说【图论,并查集】的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: tplink路由器桥接怎么桥接tplin
 - 下一篇: P1892-团伙【图论,并查集】