토폴로지 정렬 bfs 알고리즘

1468 단어
BFS 로 작 성 된 토폴로지 순 서 를 처음 봤 어 요. 
DFS 보다 이해 하기 쉬 운 게 많아 요.
토폴로지 정렬 알고리즘 사상
1. AOV 네트워크 에서 직접 전구 가 없 는 정점 을 선택 하고 출력 합 니 다.
2. 그림 에서 이 정점 을 삭제 하고 모든 방향 을 삭제 합 니 다.
3. 상기 절 차 를 반복 하여
◆ 모든 정점 이 출력 되 고 토폴로지 의 질서 있 는 서열 이 형성 되 며 토폴로지 정렬 이 완료 되 었 습 니 다.
◆ 그림 에 출력 되 지 않 은 정점 이 있 지만 처리 순환 에서 벗 어 났 다.이 설명 그림 에는 아직 정점 이 남 았 는데, 그것들 은 모두 직접적인 선구 가 있어 서, 더 이상 선구 가 없 는 정점 을 찾 을 수 없다.이때 AOV 네트워크 에는 반드시 방향 고리 가 존재 한다.두 가지 상황 으로 만 든 문제 로 이 해 를 심화 시킨다 (토폴로지 정렬 이 완성 되 고 AOV 네트워크 에 반드시 방향 고리 가 존재 한다).
이런 좋 은 실현:
사실 토폴로지 순 서 는 넓 은 검색 이다.
토폴로지 정렬 방법 은 다음 과 같다.
(1) 그림 에서 전구 가 없 는 정점 을 선택 하고 출력 합 니 다.
(2) 인터넷 에서 이 정점 을 삭제 하고 이 정점 에서 나 오 는 모든 방향 을 삭제 합 니 다.
(3) 상기 두 단 계 를 반복 하여 남 은 네트워크 에 더 이상 앞으로 나 아가 지 않 는 정점 이 존재 하지 않 을 때 까지 한다.
int graph[narray][narray]; //    
int indegree[narray]; //        
int n; //n      
memset(graph,0,sizeof(graph));
memset(indegree,0,sizeof(indegree));
for(i=1;i<=n;++i) //  n          
{
    for(j=1;j<=n;++j) //        
    {
        if(indegree[j]==0)
        {
            indegree[j]--; //       -1,            
            if(i!=n) printf("%d ",j);
            else printf("%d
",j); for(k=1;k<=n;++k) { if(graph[j][k]) indegree[k]--; // } break; } } }

출처:http://blog.chinaunix.net/uid-26602509-id-3196077.html

좋은 웹페이지 즐겨찾기