루오 밸리 1273

프리미엄 케이블 TV 네트워크는 중요한 축구 경기를 방송 할 계획이다. 그들은, 네트워크 및 사용자 단말기가 트리 구조는,이 나무의 뿌리가 축구 경기 장면에 위치하고 구성하는 방송 각 사용자 단말기, 나무의 다른 내부 노드의 통과 지점을 떠난다.

공지되어있는 모든 사용자 단말의 비용 중계국으로부터 상기 중계국에 중계국 및 신호 전송에서 방송 송신 신호의 총 비용은 비용의 합과 동일하다.

각 사용자는 지금 요금이 흥미 진진한 축구 경기를보고 싶어 준비, 케이블 텔레비전 네트워크는 사용자가 사용자에게 신호를 제공하는 신호를 제공하지 않기로 결정 할 권리가 있습니다.

해결책을 찾기 위해 프로그램을 작성하면 사용자가 돈을 잃지 않고 가능한 한 케이블 TV 방송을 볼 수 있습니다.

입력 형식

입력 파일의 첫 번째 라인은 두 개의 공간으로 분리 정수 2≤N≤3000,1≤M≤N-1, N은 케이블 텔레비전 네트워크를 통해 노드의 총 개수이고 N 및 M을 포함하고, M은 사용자 단말 인 수.

트리의 루트 인 제 중계국 한 번호가 다른 방송국은 NM, N.로 사용자 단말 번호 NM + 1 2 번째

NM 후속 라인 각각 나타냄 - 다음과 같은 형식으로, i 번째 중계국을 나타내는 데이터 방송국 난 + 1 라인 데이터 :

K A1 C1 A2 C2 ... 준비 이야기

K는 각 노드의 정수 A 및 C의 쌍에 해당하는 중계국에서 K 액세스 노드 (중계국 또는 가입자)를 나타내고, A는 노드의 수를 나타내며, C는 현재의 중계국의 비용을 나타내는 노드 (A)에 신호를 송신 . 차례로 마지막 줄은 모든 사용자가 게임을 시청하고 액수의 돈을 지불 할 준비가되어 있다는 것을 의미한다.

출력 형식

라인 출력 파일은 상기 문제에 필요한 사용자의 최대 수를 나타내는 정수를 포함한다.

샘플 입출력

입력 # 1
5 3 
2 2 2 5 3 
2 3 2 4 3 
3 4 2
출력 # 1

설명 / 팁

샘플 해석

과 같이 다섯 개 가지 노드가 있습니다. ①, M의 총 N을 수 N-M + 1으로부터 금액, 그들은 게임 3 볼 준비한 UE로 루트 노드, 즉 라이브 스테이션, 환승역 ②, ③④⑤되어있다 4,2는, 신호가 아니라 노드 ⑤ 비용 (두 번째 행에 도시 된 데이터) (3)에 신호를 보낼 수 있고, 비용이 2이고, ② 노드에 노드 ①에서 송신 될 수 있고, 노드 신호 ② 노드로부터 전송 될 수있다 비용 2 ③ 가리 킵니다. 또한 노드 ④ (세 번째 행에 도시 된 데이터) (3)의 선정에 신호를 전송할 수 있고, 만약 사용자의 모든 (③④⑤) 환상 게임 수, 신호 전송의 총 비용 :

사용자보다 더 큰 + 2 + 3 = 10 2 + 3의 총 비용을 지불 할 용의가 3 + + 2 = 9 4, 돈을 잃고,하지만 두 사용자가 게임 ③④ 돈을 손실되지 볼 수 있도록 케이블 네트워크.

 

나는 알고리즘의 복잡성을 작성할 수 있습니다, 울고, 그는 알고리즘 N ^ 3 (나는 생각한다), 최대 급여까지 포인트 60ms, 같은 N ^ 2 빠른 알고리즘을 썼다.

온라인 코드는 N ^ 2이 문제의 복잡성의 증거를 찾지 못했습니다 오랜 시간 동안 사람을 찾을 수있는 생각이다.

 

#INCLUDE <큐> 
#INCLUDE < 문자열 > 
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <iostream> 
#INCLUDE <알고리즘>
 사용  스페이스 성병;
#DEFINE는 오래 오래 어떠냐
 const를 INF = LL 1000000000000000000ll을;
CONST의  INT의 maxn = 3005 ;
INT DP [maxn] maxn];
INT CNT [maxn]; 

INT의 헤드 [maxn * 2 ] 내지 [maxn * 2 , NE [maxn * 2 ] 발 [maxn * 2 , TOT = 0 ;
int로 N, M, K;
int로 A, C 단계;
INT ANS = 0 ; 
인라인 공극 추가 ( int로 U, INT의 V, INT의 c) { 
    [TOT] 내지 = V; 
    북동 [더하다] = 헤드 [U]; 
    발 [TOT] =의 C; 
    헤드 [U]는 ++ = TOT를 ; 

    행 [TOT] = U; 
    북동 [더하다] = 헤드 [V]; 
    발 [TOT] =의 C; 
    헤드 [V] = TOT ++ ; 
} 

공극 DFS ( INT U, INTFA) { 
    DP는 [U]는 [ 0 ] = 0 ;
    위한 ( int로 I = 헤드 [U] I =! - 1 ] = I의 NE [I]) {
         INT의 V = 내지 [I];
        경우 (V == FA가) 계속 ; 
        DFS (V U, 께); 
        CNT [U] + = CNT [V];
         ( INT J = CNT [U], t = CNT [V], J, J - t = 분 (CNT [V], J))
             에 대한 ( INT K = 1 ; K <= t k 번째 ++ ) 
                DP [U] [J] = 최대 (DP [U] [J], DP [U]가 [JK] + DP [V] [K] - 브로 [I]); 
    } 

}
INT 의 main () { 
    는 scanf ( " %의 D % d에 " , N, m); 
    memset 함수 (머리 - 1 , 를 sizeof (헤드)); 
    memset 함수 (DP, 128 , 는 sizeof (DP));
    위한 ( int로 I = 1 ; I <= 나노 미터; 내가 ++ ) { 
        는 scanf ( " %의 D ' , K);
         ( INT의 J = 0 ; J <K, J ++ ) { 
            는 scanf ( " % d 개 %의 D ' , A, 및 C); 
            추가 (I, A, C);
        } 
    } 
    에 대한( int로 난 = N-m + 1 , i가 N = <; 내가 ++ ) 
        는 scanf를 ( " %의 D " , DP [I] [ 1 ]), CNT [I] = 1 ; 
    DFS ( 1 - 1 );
    위한 ( int로 I = m의 단계; I> = 0 ; 난 ...) 의 경우 (DP [ 1 ] [I]> = 0 ) { 
        의 printf ( " % D \ 없음 " , I); 휴식 ; 
    } 
    반환  0 ; 
} 
/ * 

2 1 
1 2 2 
3 


* /
코드보기

 

 

추천

출처www.cnblogs.com/kongbb/p/11366727.html