Sự hiểu biết của tôi về vấn đề, như đã nêu ban đầu và sau đó được cập nhật bởi các bình luận dưới câu trả lời của Macke, bao gồm: 1) cả hai loại cạnh (phụ thuộc và xung đột) đều được định hướng; 2) nếu hai nút được kết nối bởi một cạnh, chúng không được kết nối bởi một nút khác, ngay cả khi nó thuộc loại khác hoặc ngược lại; 3) nếu một đường dẫn giữa hai nút có thể được xây dựng bằng cách trộn các cạnh của các loại khác nhau, thì đó là một lỗi, thay vì một tình huống bị bỏ qua; 4) Nếu có một đường dẫn giữa hai nút sử dụng các cạnh của một loại, thì có thể không có đường dẫn khác giữa chúng sử dụng các cạnh của loại khác; 5) các chu kỳ của một loại cạnh đơn hoặc loại cạnh hỗn hợp không được phép (từ một phỏng đoán tại ứng dụng, tôi không chắc chắn rằng các chu trình chỉ xung đột là một lỗi, nhưng nếu không thì có thể loại bỏ điều kiện này.)
Hơn nữa, tôi sẽ giả sử cấu trúc dữ liệu được sử dụng không ngăn chặn vi phạm các yêu cầu này được thể hiện (ví dụ: không thể biểu thị điều kiện vi phạm 2 trong ánh xạ từ cặp nút sang (loại, hướng) nếu luôn luôn ghép cặp nút có nút được đánh số ít nhất trước.) Nếu một số lỗi nhất định không thể được biểu thị, nó sẽ giảm số lượng các trường hợp được xem xét.
Thực tế, có ba biểu đồ có thể được xem xét ở đây: hai biểu đồ chỉ có một cạnh và biểu đồ hỗn hợp được hình thành bởi sự kết hợp của một trong hai loại. Bạn có thể sử dụng điều này để tạo ra một cách có hệ thống tất cả các biểu đồ lên đến một số nút. Trước tiên, tạo tất cả các đồ thị có thể có của các nút N có không quá một cạnh giữa hai cặp nút được đặt hàng (các cặp theo thứ tự vì đây là các đồ thị có hướng.) hình thành liên minh của mỗi cặp.
Nếu cấu trúc dữ liệu của bạn không thể biểu thị vi phạm điều kiện 2, bạn có thể giảm đáng kể các trường hợp được xem xét bằng cách chỉ xây dựng tất cả các biểu đồ xung đột có thể phù hợp trong không gian của biểu đồ phụ thuộc hoặc ngược lại. Nếu không, bạn có thể phát hiện vi phạm điều kiện 2 trong khi hình thành liên minh.
Trên đường ngang đầu tiên của đồ thị kết hợp từ nút đầu tiên, bạn có thể xây dựng tập hợp tất cả các đường dẫn đến mọi nút có thể tiếp cận và khi bạn làm như vậy, bạn có thể kiểm tra vi phạm tất cả các điều kiện (để phát hiện chu kỳ, bạn có thể sử dụng thuật toán của Tarjan .)
Bạn chỉ phải xem xét các đường dẫn từ nút đầu tiên, ngay cả khi biểu đồ bị ngắt kết nối, bởi vì các đường dẫn từ bất kỳ nút nào khác sẽ xuất hiện dưới dạng các đường dẫn từ nút đầu tiên trong một số trường hợp khác.
Nếu các đường dẫn hỗn hợp đơn giản có thể bị bỏ qua, thay vì là lỗi (điều kiện 3), thì đủ để xem xét các biểu đồ phụ thuộc và xung đột một cách độc lập và kiểm tra xem nếu một nút có thể truy cập được ở một nút thì nó không phải là nút khác.
Nếu bạn nhớ các đường dẫn được tìm thấy trong việc kiểm tra biểu đồ của các nút N-1, bạn có thể sử dụng chúng làm điểm bắt đầu để tạo và đánh giá biểu đồ của các nút N.
Điều này không tạo ra nhiều cạnh cùng loại giữa các nút, nhưng nó có thể được mở rộng để làm như vậy. Tuy nhiên, điều này sẽ làm tăng đáng kể số lượng các trường hợp, vì vậy sẽ tốt hơn nếu mã được kiểm tra khiến điều này không thể đại diện hoặc không thể thực hiện được, đã lọc ra tất cả các trường hợp như vậy trước đó.
Chìa khóa để viết một lời sấm truyền như thế này là giữ cho nó đơn giản nhất có thể, ngay cả khi điều đó có nghĩa là không hiệu quả, để bạn có thể thiết lập niềm tin vào nó (lý tưởng thông qua các lập luận cho tính chính xác của nó, được hỗ trợ bằng thử nghiệm.)
Khi bạn có phương tiện để tạo các trường hợp thử nghiệm và bạn tin tưởng vào lời tiên tri mà bạn đã tạo để phân tách chính xác hàng hóa với cái xấu, bạn có thể sử dụng phương pháp này để lái thử mã tự động của mã đích. Nếu điều đó là không khả thi, lựa chọn tốt nhất tiếp theo của bạn là tìm hiểu các kết quả cho các trường hợp đặc biệt. Nhà tiên tri có thể phân loại các lỗi mà nó tìm thấy và cung cấp cho bạn một số thông tin về các trường hợp được chấp nhận, chẳng hạn như số lượng và độ dài đường dẫn của từng loại và liệu có bất kỳ nút nào ở đầu của cả hai loại đường dẫn này không có thể giúp bạn tìm kiếm những trường hợp bạn chưa từng thấy trước đây.