Professional Documents
Culture Documents
Nhóm bạn bè - Xem lại lần làm thử
Nhóm bạn bè - Xem lại lần làm thử
Trong một trường học có n học sinh, một học sinh có thể là bạn với một số học sinh khác. Mối quan hệ bạn bè giữa các học sinh có tính hai chiều (A là bạn
của B thì B cũng là bạn của A ) và tính bắc cầu (nếu A là bạn của B, B là bạn của C thì A là bạn của C ). Một nhóm học sinh được gọi là nhóm bạn bè
nếu tất cả mọi người trong nhóm là bạn của nhau.
Cho ma trân M kích thước n × n biểu diễn mối quan hệ của các học sinh trong trường, trong đó Mi,j = Mj,i = 1 nếu i và j là bạn của nhau. Bạn hãy
viết chương trình tính số lượng nhóm bạn bè trong trường học.
Đầu vào
Dữ liệu vào từ bàn phím gồm n + 1 dòng. Dòng đầu tiên chứa n số nguyên là số lượng học sinh trong trường (n ≤ 1000) n. dòng tiếp theo mỗi dòng
chứa n số nguyên cách nhau bởi một dấu cách thể hiện ma trận biểu diễn mối quan hệ giữa các học sinh trong trường.
Đầu ra
In ra màn hình một dòng duy nhất chứa số lượng nhóm bạn bè trong trường.
For example:
Input Result
4 2
1 1 0 0
1 1 1 0
0 1 1 0
0 0 0 1
Answer:
1 #include<bits/stdc++.h>
2 using namespace std;
3 void dfs(int** a, vector<bool> &marked, int i, int n)
4 ▼ {
5 marked[i] = true;
6 for(int j = 0; j < n; j++)
7 ▼ {
8 if(!marked[j] && a[i][j] == 1) // chưa duyệt i, i và j là bạn
9 ▼ {
10 dfs(a,marked,j,n); // duyệt j, tiếp tục tìm bạn j
11 }
12 }
13 }
14 int main()
15 ▼ {
16 int n;
17 vector<bool> marked;
18 cin >> n;
19 marked.resize(n,false);
20 int** a = new int *[n];
21 for( int i = 0; i < n; i++)
22 ▼ {
23 a[i] = new int [n];
24 for(int j = 0; j < n; j++)
25 ▼ {
26 cin >> a[i][j];
27 }
28 }
Đúng