Meu entendimento do problema, como originalmente declarado e depois atualizado pelos comentários da resposta de Macke, inclui o seguinte: 1) os dois tipos de borda (dependências e conflitos) são direcionados; 2) se dois nós estiverem conectados por uma borda, eles não deverão estar conectados por outra, mesmo que seja do outro tipo ou ao contrário; 3) se um caminho entre dois nós puder ser construído misturando arestas de tipos diferentes, isso será um erro, e não uma circunstância que será ignorada; 4) Se houver um caminho entre dois nós usando arestas de um tipo, pode não haver outro caminho entre eles usando arestas do outro tipo; 5) ciclos de um tipo de borda única ou de borda mista não são permitidos (de um palpite no aplicativo, não tenho certeza de que os ciclos somente de conflito sejam um erro, mas essa condição pode ser removida, se não).
Além disso, assumirei que a estrutura de dados usada não impede que violações desses requisitos sejam expressas (por exemplo, um gráfico que viole a condição 2 não pôde ser expresso em um mapa do par de nós para (tipo, direção) se o par de nós sempre possui o nó menos numerado primeiro.) Se certos erros não puderem ser expressos, isso reduzirá o número de casos a serem considerados.
Na verdade, existem três gráficos que podem ser considerados aqui: os dois exclusivamente de um tipo de aresta e o gráfico misto formado pela união de um de cada um dos dois tipos. Você pode usar isso para gerar sistematicamente todos os gráficos até um certo número de nós. Primeiro, gere todos os gráficos possíveis de nós N com não mais de uma aresta entre dois pares de nós ordenados (pares ordenados porque esses são gráficos direcionados.) Agora pegue todos os pares possíveis desses gráficos, um representando dependências e outro representando conflitos, e formar a união de cada par.
Se sua estrutura de dados não puder expressar violações da condição 2, você poderá reduzir significativamente os casos a serem considerados, construindo apenas todos os gráficos de conflito possíveis que se encaixem nos espaços dos gráficos de dependência ou vice-versa. Caso contrário, você poderá detectar violações da condição 2 ao formar a união.
Em um percurso amplo do gráfico combinado a partir do primeiro nó, você pode construir o conjunto de todos os caminhos para todos os nós alcançáveis e, ao fazer isso, pode verificar violações de todas as condições (para detecção de ciclo, você pode use o algoritmo de Tarjan .)
Você só precisa considerar os caminhos do primeiro nó, mesmo que o gráfico esteja desconectado, pois em outros casos os caminhos de qualquer outro nó aparecerão como caminhos do primeiro nó.
Se caminhos de borda mista podem simplesmente ser ignorados, em vez de serem erros (condição 3), é suficiente considerar os gráficos de dependência e conflito de forma independente e verificar se, se um nó é alcançável em um, ele não está no outro.
Se você se lembrar dos caminhos encontrados no exame de gráficos de nós N-1, poderá usá-los como ponto de partida para gerar e avaliar gráficos de N nós.
Isso não gera várias arestas do mesmo tipo entre os nós, mas pode ser estendido para isso. No entanto, isso aumentaria muito o número de casos, portanto, seria melhor se o código sendo testado tornasse impossível representar ou, na sua falta, filtrar todos esses casos previamente.
A chave para escrever um oráculo como esse é mantê-lo o mais simples possível, mesmo que isso signifique ser ineficiente, para que você possa estabelecer confiança nele (idealmente através de argumentos para sua correção, apoiados em testes).
Depois de ter os meios para gerar casos de teste e confiar no oráculo que você criou para separar com precisão o bem do mal, você pode usá-lo para conduzir o teste automatizado do código de destino. Se isso não for possível, sua próxima melhor opção é vasculhar os resultados em casos distintos. O oracle pode classificar os erros encontrados e fornecer algumas informações sobre os casos aceitos, como o número e o comprimento dos caminhos de cada tipo, e se há algum nó no início dos dois tipos de caminho, e isso poderia ajudá-lo a procurar casos que você nunca viu antes.