CDOJ 1070 秋实大哥打游戏 带权并查集
鏈接
F -?秋實大哥打游戲 Time Limit:1000MS?????Memory Limit:65535KB?????64bit IO Format:%lld & %llu Submit?Status?Practice?UESTC 1070 Appoint description:?System Crawler? (2016-04-24)Description
”也許人生就是游戲,你卻執意耕耘著春秋。” —— 秋實大哥嘆道。
秋實大哥是一個喜歡玩游戲的人,相較于其他種類的游戲,秋實大哥更喜歡自由開放的沙盒游戲,尤其是minecraft。
現在,秋實大哥發現了N個獨立的小島(編號1,2,3…..N),于是他要把這些小島連起來。
每一次,秋實大哥會選擇兩個不同的小島x(x是所在集合的中心)和y(y不一定是集合的中心),如果小島x和小島y不在一個集合里,就建立一條距離為|x?y|?mod?1000的邊,
把這兩片小島合并為一個新的集合,中心為y原來所在的集合中心。
但,秋實大哥想實時知道某一個小島距當前所在集合中心的距離。由于秋實大哥忙著過節,所以他想請你幫忙。
Input
第一行有一個整數N表示小島的個數。
接下來有若干行,每一行為以下兩種操作中的一種:
I x y : 表示秋實大哥想要在x和y之間建立一條邊。 E x : 詢問x到當前集合中心的距離。輸入以一個大寫字母O結束。
1≤N≤100000,操作數≤200000。
Output
對于每一次詢問,輸出一個整數,即x到當前集合中心的距離,占一行。
Sample Input
3?
I 1 2?
E 1?
I 3 1?
E 3?
O
Sample Output
1?
3
要求:復習時重做一遍
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <stack> #include <map> #include <algorithm> #include <set> using namespace std; typedef long long LL; typedef unsigned long long Ull; #define MM(a,b) memset(a,b,sizeof(a)); const double eps = 1e-10; const int inf = 0x3f3f3f3f; const double pi=acos(-1); const int maxn=100000; char s[5]; int f[maxn+10],dis[maxn+10];int findr(int x) {if(f[x]!=x){int par=f[x];//在路徑壓縮之前保存連接的邊,否則路徑壓縮后直接指向根節點f[x]=findr(f[x]);//遞歸dis[x]+=dis[par];}return f[x]; }void unite(int x,int y) {int ry=findr(y);if(x==ry) return;f[x]=y;//建立一條邊dis[x]=abs(x-y)%1000;//這個初始化非常重要,好好想想 }int main() {int n;while(~scanf("%d",&n)){for(int i=1;i<=n;i++) {f[i]=i;dis[i]=0;}while(~scanf("%s",s)){int x,y;if(s[0]=='I'){scanf("%d %d",&x,&y);unite(x,y);}else if(s[0]=='E'){scanf("%d",&x);findr(x);printf("%d\n",dis[x]);}else break;}}return 0; }分析:寫的第一道帶權并查集,還是挺有意思的,跟普通并查集比起來就是邊多了權值,
抓住核心式子,dis[child ?to ?par ?]+=dis[par to ? root],以兒子和父親間合并的那條邊為橋梁
轉載于:https://www.cnblogs.com/smilesundream/p/5440246.html
總結
以上是生活随笔為你收集整理的CDOJ 1070 秋实大哥打游戏 带权并查集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hrbust1841再就业(状态压缩dp
- 下一篇: 设计模式(八): 从“小弟”中来类比外观