2013-04-08 5 views
0

첫째 : 나는 프로그래밍 (지분에의 속삭임이 승리 또는 무언가) 대회의 일부가Discrete Maths : 정점을 제거한 후 그래프의 연결을 확인 하시겠습니까? 효율적인 방법?

내가 & 알고리즘 다음 시도 문제를 읽은 후 다음과 같은 결론에 도달 한 것으로 인정한다.

나는 두 가지 방법으로이 문제를 구현했습니다

count = 0 
For i=1 to n: 
    remove(ith vertex) 
    check for connectivity of graph with remaining vertices 
    if connected 
    then increment count 
    attach the removed vertex back 
print count 

n 정점의

을 감안할 때 지시되지 연결된 그래프, (1) DFS (2) - 연결되지 않은 설정 연합 (EU)하지만 알고리즘의 아무도는 AC를 얻을 수있을만큼 효율적 . 그렇게 할 수있는 더 좋은 방법이 있습니까? 나는 상세한 설명이 필요없고, 몇 마디 할 것이고, 쉬지 않고 알아 내려고 시도 할 것입니다 : p. 고맙습니다!

답변

1

입력 그래프에 따라 몇 가지 옵션이 있으며 각 옵션마다 장점이 있습니다. 필자는 개인적으로 모든 노드의 실패를 시뮬 레이팅하지 않았고 너무 많은 시간이 걸리는 전체 그래프에서 연결을 확인했습니다.

스패닝 트리를 만드는 것이 더 현명한 방법 일 수 있습니다. 트리의 나머지 부분은 여전히 ​​다른 모든 것을 연결하기 때문에 트리의 모든 리프는 나머지 그래프를 연결 해제하지 않고 제거 할 수 있습니다. 그 하나의 나무를 만들면 개별 시험에서 잎을 건너 뛸 수 있습니다. 더 많은 나무를 만들어 다른 노드 (비 잎) 중 일부를 나뭇잎 (건너 뛸 수 있음)으로 만들 수 있습니다. 여러 노드의 BFS가 시작될 수 있습니다.

또한 노드 1 제거를 시뮬레이트 할 때 인접 노드가 여전히 서로 연결되어 있는지 확인하면됩니다. 이웃이 연결된 경우 나머지 그래프도 연결됩니다. 그래프가 밀집된 경우 노드 당 작업이 제한됩니다.