在乙個社群裡,每個人都有自己的小圈子,還可能同時屬於很多不同的朋友圈。我們認為朋友的朋友都算在乙個部落裡,於是要請你統計一下,在乙個給定社群中,到底有多少個互不相交的部落?並且檢查任意兩個人是否屬於同乙個部落。
輸入在第一行給出乙個正整數n(≤104),是已知小圈子的個數。隨後n行,每行按下列格式給出乙個小圈子裡的人:
k p[1] p[2] ⋯ p[k]
其中k是小圈子裡的人數,p[i](i=1,⋯,k)是小圈子裡每個人的編號。這裡所有人的編號從1開始連續編號,最大編號不會超過104。
之後一行給出乙個非負整數q(≤104),是查詢次數。隨後q行,每行給出一對被查詢的人的編號。
首先在一行中輸出這個社群的總人數、以及互不相交的部落的個數。隨後對每一次查詢,如果他們屬於同乙個部落,則在一行中輸出y
,否則輸出n
。
4
3 10 1 2
2 3 4
4 1 5 7 8
3 9 6 4
210 5
3 7
10 2
yn
題目大意上面說的很清楚,這裡就多說了。
思路:首先我們還是要注意審題!!!,這道題為啥一開始沒想到是並查集呢?因為我沒看見朋友的朋友還是朋友,當時看榜出的那堆人,心裡現在還是涼涼的,所以這是一道簡單的並查集的題目,不過需要用兩個set集合來統計總人數,祖先數。
但是這道題我們用並查集模板上交,會發現其中乙個樣例是卡不過去,顯示執行超時,這是因為普通的並查集模板find函式並不是最優化的狀態,下面的ac**中會給出解釋。
下面給出ac**:
#include #include #include #include using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1e6+10;
int father[maxn];
setpeo;
setnum;
int find(int x)
void unite(int x,int y)
int main()
return 0;
}
SDOI2010 地精部落解題報告
這道題是我看了題解以後才做出來的,真是一道神題,但是寫題解的大神都不願解釋得太詳細,所以我想了很久才想明白。看了題解以後真的覺得很像數的劃分 約瑟夫問題還有國王遊戲,出奇地簡潔,但是思維量相當地高。主要思路 離散。三個引理 在n n 1的轉化過程中,我們刪除了乙個點後,我們可以將n 1個點視為仍是1...
部落衛隊pascal解題程式
type jh set of 0.100 集合 varn,m,i,u,v,tj longint w jh a,f array 0.100 of boolean s array 1.100 of jh procedure search dep longint w jh t longint dep是第幾...
Block Voting 解題報告
這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...