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의 추종자들이 성가 산책 포인트