Submission #940888

#TimeUsernameProblemLanguageResultExecution timeMemory
940888PacybwoahVillage (BOI20_village)C++17
50 / 100
107 ms22368 KiB
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int> > graph;
vector<int> match,prem;
vector<vector<int> > dp;
void dfs_min(int node,int parent){
    for(auto x:graph[node]){
        if(x==parent) continue;
        dfs_min(x,node);
        dp[node][0]+=max(dp[x][0],dp[x][1]);
    }
    for(auto x:graph[node]){
        if(x==parent) continue;
        if(dp[node][1]<dp[node][0]-max(dp[x][0],dp[x][1])+dp[x][0]+1){
            dp[node][1]=dp[node][0]-max(dp[x][0],dp[x][1])+dp[x][0]+1;
            prem[node]=x;
        }
    }
}
void dfs_match(int node,int parent,bool flag){
    if(flag||dp[node][0]>=dp[node][1]){
        for(auto x:graph[node]){
            if(x==parent) continue;
            dfs_match(x,node,0);
        }
    }
    else{
        match[node]=prem[node];
        match[prem[node]]=node;
        for(auto x:graph[node]){
            if(x==parent) continue;
            if(x==prem[node]) dfs_match(x,node,1);
            else dfs_match(x,node,0);
        }
    }
}
int main(){
    int n;
    cin>>n;
    graph.resize(n+1);
    prem.resize(n+1);
    int a,b;
    for(int i=1;i<n;i++){
        cin>>a>>b;
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    dp.resize(n+1,vector<int>(2));
    match.resize(n+1,-1);
    dfs_min(1,0);
    dfs_match(1,0,0);
    vector<int> ans_min(n+1);
    for(int i=1;i<=n;i++){
        if(match[i]!=-1){
            ans_min[i]=match[i];
        }
        else ans_min[i]=i;
    }
    int min_cnt=max(dp[1][1],dp[1][0])*2;
    for(int i=1;i<=n;i++){
        if(match[i]==-1){
            swap(ans_min[i],ans_min[graph[i][0]]),min_cnt+=2;
        }
    }
    cout<<min_cnt<<" 1\n";
    for(int i=1;i<=n;i++) cout<<ans_min[i]<<" \n"[i==n];
    for(int i=1;i<=n;i++) cout<<ans_min[i]<<" \n"[i==n];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...