Submission #394659

#TimeUsernameProblemLanguageResultExecution timeMemory
394659erfanmirNetwork (BOI15_net)C++17
100 / 100
534 ms45444 KiB
// In the name of god

#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 

using namespace std;
using namespace __gnu_pbds; 

template < class T > using ordered_set = tree < T , null_type , less < T > , rb_tree_tag , tree_order_statistics_node_update >;
  
typedef long long                   ll;
typedef long double                 ld;
typedef pair<int,int>               pii;
typedef pair<ll,ll>                 pll;
#define all(x)                      (x).begin(),(x).end()
#define lc(x)                       (x) << 1
#define rc(x)                       (x) << 1 | 1
#define F                           first
#define S                           second
#define fast_io                     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io                     freopen("in.txt" , "r+" , stdin) ; freopen("out.txt" , "w+" , stdout);
#define mp                          make_pair
ll poww(ll a, ll b, ll md) {
    ll ans = 1;
    for(; b; b >>= 1, a = a * a % md){
        if(b & 1){
            ans = ans * a % md;
        }
    }
    return ans % md;
}

const int MAXN = 5e5 + 10;
const int MAXLG = 18;
const int MOD = 1e9 + 7;
const int MOD2 = 998244353;
const ll INF = 8e18;
int n, root, ans;
vector<int> adj[MAXN], leaf;
vector<pii> res;

void dfs(int v, int p = 0){
    if((int)adj[v].size() == 1){
        leaf.push_back(v);
    }
    for(auto u : adj[v]){
        if(u == p){
            continue;
        }
        dfs(u, v);
    }
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i < n; i++){
        int v, u;
        scanf("%d %d", &v, &u);
        adj[v].push_back(u);
        adj[u].push_back(v);
    }
    for(int i = 1; i <= n; i++){
        if((int)adj[i].size() > 1){
            root = i;
            break;
        }
    }
    dfs(root);
    int sz = (int)leaf.size();
    ans = sz / 2 + (sz & 1);
    int hv = sz / 2;
    for(int i = 0; i < hv; i++){
        res.push_back(mp(leaf[i], leaf[i + hv + (sz & 1)]));
    }
    if(sz & 1){
        res.push_back(mp(leaf[hv], root));
    }

    printf("%d\n", ans);
    for(int i = 0; i < ans; i++){
        printf("%d %d\n", res[i].F, res[i].S);
    }
}

Compilation message (stderr)

net.cpp:3: warning: ignoring #pragma comment  [-Wunknown-pragmas]
    3 | #pragma comment(linker, "/stack:200000000")
      | 
net.cpp: In function 'int main()':
net.cpp:59:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   59 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
net.cpp:62:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   62 |         scanf("%d %d", &v, &u);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...