관광 계획[뿌리를 바꾸어 나무의 직경에 존재할 수 있는 점을 구한다]

2534 단어 DP 동적 계획

제목 링크


제목: 0~N-1의 나무에서 N개의 점을 구하고 나무의 직경에 존재할 수 있는 점을 구하며 좌표를 오름차순으로 출력한다.
먼저 나무형 dp의 방식을 이용하여 나무의 직경을 구한 다음에 뿌리 dp를 바꾸는 방법에 따라 우리는 각 점을 중심으로 할 때 가장 먼 거리가 얼마나 되는지 구하여 나무의 직경을 구성할 수 있는지 판단할 수 있다.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 2e5 + 7;
int N, head[maxN], cnt;
struct Eddge
{
    int nex, to;
    Eddge(int a=-1, int b=0):nex(a), to(b) {}
} edge[maxN << 1];
inline void addEddge(int u, int v)
{
    edge[cnt] = Eddge(head[u], v);
    head[u] = cnt++;
}
inline void _add(int u, int v) { addEddge(u, v); addEddge(v, u); }
int dp[maxN][2], maxD;
void dfs(int u, int fa)
{
    for(int i=head[u], v; ~i; i=edge[i].nex)
    {
        v = edge[i].to;
        if(v == fa) continue;
        dfs(v, u);
        if(dp[u][0] < dp[v][0] + 1)
        {
            dp[u][1] = dp[u][0];
            dp[u][0] = dp[v][0] + 1;
        }
        else if(dp[u][1] < dp[v][0] + 1)
        {
            dp[u][1] = dp[v][0] + 1;
        }
        maxD = max(maxD, dp[u][0] + dp[u][1] + 1);
    }
}
vector ans;
void change_root(int u, int fa, int deep)
{
    if(max(deep, dp[u][1]) + dp[u][0] + 1 == maxD) ans.push_back(u);
    for(int i=head[u], v; ~i; i=edge[i].nex)
    {
        v = edge[i].to;
        if(v == fa) continue;
        change_root(v, u, (dp[v][0] + 1 == dp[u][0] ? max(dp[u][1], deep) + 1 : max(dp[u][0], deep) + 1) );
    }
}
inline void init()
{
    cnt = 0; maxD = 0;
    for(int i=0; i<=N; i++) head[i] = -1;
}
int main()
{
    scanf("%d", &N);
    init();
    for(int i=1, u, v; i

좋은 웹페이지 즐겨찾기