-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCON9_30.cpp
48 lines (42 loc) · 1.57 KB
/
CON9_30.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* Cho đồ thị có hướng liên thông yếu G=<V, E> được biểu diễn dưới dạng danh sách cạnh. Hãykiểm tra xem đồ thị có chu trình Euler hay không?
2
6 10
1 2 2 4 2 5 3 1 3 2 4 3 4 5 5 3 5 6 6 4
3 3
1 2 2 3 1 3
1
0
*/
#include <bits/stdc++.h>
using namespace std;
/*Hệ quả: Một đồ thị có hướng liên thông yếu G=(V,E) có chu trình Euler thì mọi đỉnh của nó có bán bậc ra bằng bán bậc vào deg+(v) = deg−(v),∀v∈V*. Ngược lại, nếu 𝐺 liên thông yếu và mọi đỉnh của nó có bán bậc ra bằng bán bậc vào, thì có chu trình Euler (đồng nghĩa với việc là đồ thị liên thông mạnh)*/
bool euler(vector<pair<int, int>> danhsachcanh, int V){
vector<int> bacra(V + 1);
vector<int> bacvao(V + 1);
for (int i = 0; i < danhsachcanh.size(); i++){
bacra[danhsachcanh[i].first]++;
bacvao[danhsachcanh[i].second]++;
}
for (int i = 1; i <= V; i++){
if(bacra[i] != bacvao[i]){
return false;
}
}
return true;
}
int main(){
int t; cin >> t;
while(t--){
int V, E; cin >> V >> E;
vector<pair<int, int>> danhsachcanh; // nếu khởi tạo kích thước (E + 1) thì đổi push_back bằng toán tử gán '='
for (int i = 1; i <= E; i++){
int a, b; cin >> a >> b;
danhsachcanh.push_back({a, b});
}
if (euler(danhsachcanh, V)){
cout << 1 <<endl;
}else{
cout<< 0 << endl;
}
}
}