톱니 (728) [24 네트워크 흐름 문제] 헝가리어 알고리즘 최소 경로 커버리지 문제

728 (24) 네트워크 흐름 문제] 최소 경로 커버리지 문제

★★★ ☆ 입력 파일을 path3.in   출력 파일 : path3.out   평가 플러그인
제한 시간 : 1 초 메모리 제한 : 128메가바이트

알고리즘은 최단 경로 문제 8-3 피복 문제 (8-13 연습)

 

'문제 설명 :

유향 그래프 G = (V, E)이 주어. P 간단한 경로 G (정점 분리형)를 세트라고하자. V 각각의 경우,

 

정점 P는 경로 P G 범위라고하며, 하나의 방법입니다. 은 V의 상단 P에서 어떤 경로

 

포인트는, 길이는 임의이며, 특히, 제로가 될 수있다. G는 최소 경로 커버리지 경로는 G의 최소 개수를 포함

 

경로의 범위.

 

경로 비순환 그래프 G.에 따르면 최소위한 효율적인 알고리즘의 설계

 

팁 :

세트 V = {1,2, ..., N}, 네트워크 구성 G1 = (V1, E1)은 다음과 같이 :

도 1은 각각의 에지의 용량이다. G1은 네트워크 (X0, Y0)의 최대 유량을 추구한다.

 

'프로그래밍 작업 :

A A 주어진 방향성 비순환 그래프 G에 대한 소정의 경우, G는 최소 클리핑 범위를 식별하는 프로그램.

 

'입력 데이터 :

input.txt를 파일로부터 입력 데이터를 제공한다. 파일 1 개 라인은 두 양의 정수 n 및 m이있다. n은 주어진 방향성 비순환 그래프

 

G의 정점의 수, m은 G.의 에지의 수는 다음의 m 행은 두 양의 정수를 갖는 각 행 i와 j, 지향 된 에지 (I, J)를 나타낸다.

 

'출력 결과 :

실행이 완료되면, 경우 output.txt에 파일 경로 범위의 최소 출력. 첫 번째 행의 각 출력 라인에서 시작

 

경로. 파일의 마지막 줄은 경로의 최소 수있다.

 

입력 파일의 예

input.txt를 

 

11 12 1 2 1 3 1 4 2 5 3 6 4 7 5 8 6 9 7 10 8 11 9 11 10 11 
                       

 

 출력 파일 예

경우 output.txt

 

1 4 7 10 11 2 5 8 3 6 9 3           

 

 

 

 

 

 

 

설명 :

코딩!

 

그는 자신이 너무 약 발견

이것은 잘못된 오 갈 수있는 문제를 다루는 비교적 간단한 양자 그래프 최단 경로를 보인다

 

오류가 발생하기 쉬운 점은 지금 우리의 질문에 대해 말하기된다

1. 수는 최소 경로에 따르면, n은 노드 - 일치 된 그래프의 최대 개수

2. 질문은 그것을 어떻게해야 다음 출력 경로를 허용?

I는 다음과 같이 할 수있는 방법을 생각

 

첫째, 우리는 큰 열거 작은 누적 시간 ANS가 안되는 시간에 헝가리 DFS 알고리즘을 실행하는 노드를 열거

즉 정상적인 상황에서 그 근래의 배열 [] = 근래 [이전] 근래되는 말을하는 것입니다하지만 우리가 내가 스크래치 때문에 출력 경로를 비교할 방법이없는 경우 (작은)의 출력을 시작합니다

 

그럼 우리 아들 배열에서 볼 수와 배열은 약 근래 단지 다른 방법입니다

우리는 다음 저장하는 배열의 정도를 설정

그래서 위의 치료 후

 

이 점은 다음 0도를 경우 우리는 단지 이후는 흔적을 인쇄 할 수있을 것입니다 우리가 아래로 시작하는 아들이 시점에서 실행 된 n 개의 지점을 열거 할 필요가

 

 

약간 구체적인 내용을 이해하는 코드를보고 (사실 그것이 매우 간단 장황한 너무 많이 난 아직 코드 비트에서 더 명확 보면 그것은)

 

명인 :

 

<. 비트 / stdc ++ H> #INCLUDE
 #DEFINE maxn 205
 하여  스페이스 성병;
INT의 N, m;
int로 힘이 [maxn, 근래 [maxn, 팀 = 0 ; 
벡터 < INT > [maxn] V;
int로  에서 [maxn];
INT의 아들 [maxn];
불리언 의 Dfs ( INT X) 
{ 
    위해 ( int로 I = 0 ; I <브이 [X] 크기는 (); 나는 ++ ) 
    { 
        INT Y = V [X] [I];
        경우 (힘 [Y]! = 팀) 
        { 
            힘 [Y] =팀;
            하다면 (! [Y] || 근래 의 Dfs (HAV [Y])) 
            { 
                근래 [Y] =의 X를; 
                아들 [X] = y로;
                에서 [Y] ++ ;
                반환  사실 ; 
            } 
        } 
    } 
    반환  거짓 ; 
} 
BOOL 인쇄 [maxn];
공극 인쇄 ( INT의 ⅰ) 
{ 
    INT X = I;
    반면 (X! = 0 ) 
    { 
        의 printf ( " %의 D ",엑스); 
        [X] 인쇄 = ; 
        X = 아들 [X]; 
    } 
    putchar ( " \ n을 ' ); 
} 
INT 의 main () 
{ 
    freopen을 ( " path3.in " , " R " , 표준 입력); 
    freopen을 ( " path3.out " , " w " , 표준 출력); 
    scanf와 ( " %의 D % d에 " , N, m);
     ( int로 I = 1 , X, Y, I <= m; ) 
        는 scanf ( " % d 개 %의 D ' , X, Y); 
        V [X] .push_back (Y); 
    } 
    INT ANS = 0 ;
    위한 ( int로 I = 1 난 ++; 나는 <= N ) 
    { 
        팀을 ++ ; 
        ANS + = 의 Dfs (I); 
    } 
    에 대해 ( int로 I = 1 난 ++; i가 N = < )
         경우 ( 에서는 [I] == 0 ) 
            출력 (I); 
    의 printf ( " % D \ 없음 " , N- ANS);
    반환 0 ; 
}

 

Zanga의 추종자들이 성가 산책 포인트

 

추천

출처www.cnblogs.com/Tidoblogs/p/11408305.html