我的朋友很少~但是朋友的朋友就是我的朋友!
範例測資
範例輸入 | 範例輸出 |
---|---|
第一行有三個正整數 N、M、Q (N <= 10000,M <= 10000,Q <= 100000),代表有 N 個人、M 筆朋友關係、Q 筆詢問。 接下來有 M 行, 每行有兩個正整數 A 和 B (A、B <= N),代表 A 和 B 有朋友關係。 再來有 Q 行, 每行兩個正整數 P 和 Q (P、Q <= N )。 | 請輸出 P 和 Q 是不是朋友,如果是請輸出 「:)」,否則請輸出 「:(」。 |
5 3 2 1 2 2 5 3 4 1 5 1 3 | 🙂 🙁 |
解題思路
宣告一個陣列代表每一個人的最底層朋友是誰,每一個人預設值為 0。如果收到人的時候這個人的陣列值為 0,代表還沒有紀錄,所以將陣列值設為自己。
宣告一個函式 findEnd 用來尋找最底層的朋友,有一個參數 N,如果 N 的陣列值為 0 或是自己就 return N,否則就 return findEnd(陣列值[N])。
收到資料的時候將 陣列值[findEnd(B)] 設為 findEnd(A)。最後只需要確認 陣列值[P] 是否等於 陣列值[Q],如果相同就代表這兩人是朋友。
範例程式碼-ZeroJudge A445: 新手訓練系列 – 我的朋友很少
#include <iostream>
using namespace std;
int MAP[870000] = {};
int findEnd(const int N) {
const int MM = MAP[N];
if (MM == 0 || MM == N) return N;
return findEnd(MM);
}
void line(const int a, const int b) {
if (MAP[a] == 0) MAP[a] = a;
if (MAP[b] == 0) MAP[b] = b;
MAP[findEnd(b)] = findEnd(a);
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
cout.sync_with_stdio(0);
cout.tie(0);
int N, M, Q;
cin >> N >> M >> Q;
for (int i = 1; i<=N; i++) MAP[i] = 0;
for (int i = 0; i<M; i++) {
int a, b;
cin >> a >> b;
line(a, b);
}
for (int i = 0; i<Q; i++) {
int a, b;
cin >> a >> b;
if (findEnd(a) == findEnd(b)) cout << ":)\n";
else cout << ":(\n";
}
}
//ZeroJudge A445
//Dr. SeanXD