codeforces 219D D. Choosing Capital for Treeland(트리 dp)
5102 단어 dpcodeforces트리 DP
제목 연결:
codeforces 219D
제목 대의:
나무 한 그루를 주지만 그 가장자리는 방향이 있다. 한 도시를 선택하고 최소한 몇 변의 방향을 조정하면 한 도시가 모든 점에 도달할 수 있고 가장 작은 조정의 변수와 대응하는 점을 출력할 수 있느냐고 묻는다.
제목 분석:
AC 코드:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#define MAX 200007
using namespace std;
int n,s,t;
vector<int> e[MAX];
vector<int> f[MAX];
int dp[MAX],dir[MAX];
void add ( int u , int v )
{
e[u].push_back ( v );
f[u].push_back ( 0 );
e[v].push_back ( u );
f[v].push_back ( 1 );
}
void dfs ( int u , int p )
{
dp[u] = 0;
for ( int i = 0 ; i < e[u].size() ; i++ )
{
int v = e[u][i];
if ( v == p ) continue;
dir[v] = f[u][i];
dfs ( v , u );
dp[u] += dp[v] + dir[v];
}
}
void solve ( int u , int p )
{
for ( int i = 0 ; i < e[u].size() ; i++ )
{
int v = e[u][i];
if ( v == p ) continue;
dp[v] = dp[u] + (dir[v]?-1:1);
solve ( v , u );
}
}
int main ( )
{
while ( ~scanf ( "%d" , &n ))
{
for ( int i = 0 ; i < MAX ; i++ )
{
e[i].clear();
f[i].clear();
}
for ( int i = 1 ; i < n ; i++ )
{
scanf ( "%d%d" , &s , &t );
add ( s , t );
}
dfs ( 1 , -1 );
solve ( 1 , -1 );
int ans = 1<<29;
for ( int i = 1 ; i <= n ; i++ )
ans = min ( ans , dp[i] );
printf ( "%d
" , ans );
vector<int> pp;
for ( int i = 1 ; i <= n ; i++ )
if ( dp[i] == ans )
pp.push_back ( i );
sort ( pp.begin() , pp.end());
for ( int i = 0 ; i < pp.size(); i++ )
printf ( "%d " , pp[i] );
puts ("");
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Codeforces Round #715 Div. 2C The Sports Festival: 구간 DP전형구간 DP의 초전형. 이하, 0-indexed. 입력을 정렬하여 어디서나 시작하고 최적으로 좌우로 계속 유지하면 좋다는 것을 알 수 있습니다. {2000})$의 주문이 된다. 우선, 입력을 소트하여 n개의 요소를 $...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.