Chu trình đồ thị tiếng anh là gì năm 2024
Trong bài viết này, chúng ta sẽ cùng nhau đi sâu hơn vào cách xác định chu trình trên đồ thị và những bài toán ứng dụng của nó. Show Giải thuật DFS\text{DFS} là một công cụ rất hữu hiệu để xác định chu trình trên đồ thị. Sau đây, chúng ta sẽ cùng tìm hiểu về ý tưởng của giải thuật. 1. Phát biểu bài toánCho một đơn đồ thị vô hướng GG gồm nn đỉnh và mm cung (có thể có "khuyên" - cạnh tự nối một đỉnh với chính nó). Các đỉnh của đồ thị được đánh số từ 11 tới nn. Một chu trình trên đồ thị là một đường đi (x1,x2,…,xk,x1)(x_1, x_2, \dots, x_k, x_1) với hai đỉnh đầu và cuối của đường đi giống nhau. Hãy xác định đồ thị trên có chứa chu trình nào hay không? Input:
Output:
Sample Input 1:
Sample Output 1:
Sample Input 2:
Sample Output 2:
2. Ý tưởngPhân loại các cung trên cây DFSTrong quá trình duyệt DFS\text{DFS} trên đồ thị, nếu như ta chỉ giữ lại các cạnh (u,v)(u, v) với uu là cha của v,v, rồi định hướng cạnh đó theo chiều (u→v),(u \rightarrow v), thì ta sẽ thu được một đồ thị mới dạng cây, gọi là cây DFS\text{DFS}. Các cạnh được giữ lại sẽ gọi là cạnh thuộc cây DFS,\text{DFS}, còn các cạnh không được giữ lại gọi là cạnh không thuộc cây DFS\text{DFS}. Cây DFS của một đồ thị gồm 9 đỉnh, các cạnh màu trắng là cạnh được giữ lại Giả sử đồ thị đang xét là đồ thị có hướng, xét mọi cung được thăm và không được thăm trong quá trình DFS,\text{DFS}, ta có các loại cung sau:
Còn nếu như xét trên đồ thị vô hướng, thì chỉ tồn tại duy nhất hai loại cung là cung thuộc cây DFS và cung ngược (không thuộc cây DFS). Phân tích giải thuậtTừ định nghĩa về cây DFS\text{DFS} ở trên, ta nhận thấy rằng:
Nhận xét trên cho ta ý tưởng về cách xác định một đồ thị có chu trình hay không vô cùng đơn giản như sau: Sử dụng DFS, duyệt từng thành phần liên thông của đồ thị. Nếu trong quá trình duyệt phát hiện một cung ngược, thì chắc chắn đồ thị có chứa chu trình. Việc xác định một cung có phải cung ngược hay không rất dễ, bằng cách sử dụng một mảng visited[u]\text{visited}[u] để đánh dấu lại đỉnh uu đã duyệt qua hay chưa. Sau đó, nếu như trong quá trình duyệt nhánh textDFStext{DFS} gốc uu mà có một cạnh (u,v)(u, v) mà vv đã thăm rồi, thì cung (u→v)(u \rightarrow v) sẽ là cung ngược. Giải thuật có thể thực hiện tương tự nhau ở cả đồ thị vô hướng lẫn có hướng. 3. Cài đặtNgôn ngữ C++:
II. Ví dụ minh họa1. Bài toán 1Đề bàiCho một dãy số AA gồm nn phần tử a0,a1,…,an−1a_0, a_1, \dots, a_{n - 1}. Xuất phát từ một phần tử ở vị trí ii bất kỳ, ta sẽ di chuyển trên mảng theo trình tự sau:
Nếu như giá trị ai mod n=0,a_i \text{ mod } n = 0, thì sẽ không có sự di chuyển nào diễn ra cả. Hãy xác định xem quá trình di chuyển trên có thể tạo thành một chu trình di chuyển trên dãy số hay không? Lưu ý rằng, nếu như bước di chuyển tự đi tới chính nó thì không tính là một chu trình. |