APCS 題目小群體
題目描述
在這個APCS的練習題中,我們需要找出給定數字串中的小群體數量。一群人會根據他們的好友關係形成小群體,其中每個人只有一個最好的朋友,這種關係可能形成閉合的群體。
練習環境
如果沒有本地編譯環境,可以在以下網站進行練習:Programiz C++ Compiler
輸入輸出格式
- 輸入:第一行包含一個正整數N,表示人數。第二行包含N個用空格隔開的數字,表示每個人的最好朋友的編號。
- 輸出:輸出一個整數,表示小群體的總數。
解題思路
本題的核心是找出閉合的好友圈,即從一個人開始追蹤他的好友,直到回到起點。每找到一個這樣的圈,就算作一個小群體。
解題程式碼
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> friends; // 儲存每個人最好朋友的編號
vector<bool> visited; // 標記是否已訪問
// 深度優先搜尋找出小群體
void dfs(int idx) {
visited[idx] = true;
int next = friends[idx];
if (!visited[next]) {
dfs(next);
}
}
int main() {
int N;
cin >> N;
friends.resize(N);
visited.assign(N, false);
for (int i = 0; i < N; i++) {
cin >> friends[i];
}
int groupCount = 0;
for (int i = 0; i < N; i++) {
if (!visited[i]) {
dfs(i);
groupCount++;
}
}
cout << groupCount << endl;
return 0;
}
評分說明
根據測試資料的不同,本題分為三個子題組,每個子題組的得分依據正確通過測試數據的數量而定。
- 子題組1:20分,1 ≤ N ≤ 100,每個小群體最多2人。
- 子題組2:30分,1 ≤ N ≤ 1,000,無其他限制。
- 子題組3:50分,1,001 ≤ N ≤ 50,000,無其他限制。
通過這個練習,學生可以加深對於圖的遍歷和深度優先搜索(DFS)的理解,這對於解決APCS或其他程式設計考試中的問題非常有幫助。