Untitled
unknown
plain_text
2 years ago
3.1 kB
11
Indexable
class Graph {
private final int V; // Số lượng đỉnh
private final int[][] adj; // Ma trận kề để lưu các cạnh
private final int[] inDegree; // Mảng lưu bậc trong của mỗi đỉnh
// Constructor để khởi tạo đồ thị với V đỉnh
public Graph(int V) {
this.V = V;
adj = new int[V][V]; // Khởi tạo ma trận kề với kích thước V x V
inDegree = new int[V]; // Khởi tạo mảng bậc trong với kích thước V
}
// Phương thức thêm cạnh từ 'source' đến 'dest'
public void addEdge(int source, int dest) {
adj[source][inDegree[source]++] = dest; // Thêm 'dest' vào danh sách kề của 'source'
inDegree[dest]++; // Tăng bậc trong của 'dest'
}
// Phương thức kiểm tra chu trình trong đồ thị
public boolean isCyclic() {
int[] queue = new int[V]; // Mảng dùng làm hàng đợi để lưu các đỉnh có bậc trong bằng 0
int front = 0, rear = 0; // Con trỏ đầu và cuối hàng đợi
int[] tempInDegree = new int[V]; // Bản sao tạm thời của mảng bậc trong
// Sao chép mảng bậc trong vào mảng tạm thời
System.arraycopy(inDegree, 0, tempInDegree, 0, V);
// Thêm các đỉnh có bậc trong bằng 0 vào hàng đợi
for (int i = 0; i < V; i++) {
if (tempInDegree[i] == 0) {
queue[rear++] = i; // Đẩy đỉnh vào hàng đợi
}
}
int visitedVertices = 0; // Đếm số đỉnh đã duyệt
// Trong khi hàng đợi không rỗng
while (front != rear) {
int current = queue[front++]; // Lấy đỉnh từ đầu hàng đợi
visitedVertices++; // Tăng số lượng đỉnh đã duyệt
// Kiểm tra tất cả các đỉnh kề của đỉnh hiện tại
for (int i = 0; i < V; i++) {
if (adj[current][i] != 0) { // Nếu có cạnh từ current đến i
if (--tempInDegree[i] == 0) {
queue[rear++] = i; // Thêm đỉnh kề vào hàng đợi nếu bậc trong của nó bằng 0
}
}
}
}
// Nếu số lượng đỉnh đã duyệt khác số lượng đỉnh của đồ thị, thì có chu trình
return visitedVertices != V;
}
// Phương thức chính để kiểm tra đồ thị
public static void main(String[] args) {
Graph graph = new Graph(4); // Tạo đồ thị với 4 đỉnh
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 2);
graph.addEdge(2, 0);
graph.addEdge(2, 3);
graph.addEdge(3, 3);
// Kiểm tra và in ra liệu đồ thị có chu trình hay không
if (graph.isCyclic()) {
System.out.println("Đồ thị có chu trình");
} else {
System.out.println("Đồ thị không có chu trình");
}
}
}Editor is loading...
Leave a Comment