zoukankan      html  css  js  c++  java
  • codeforces 765 E Tree Folding

    传送门

    题意:给你一棵树,如果有两条完全相同的链存在则可以关于中间进行折叠,即合成一条链,问你最后剩下的最少的边有多少。不能合并则输出-1

    题解:dfs处理,对每一个节点开一个set记录儿子链的长度,如果只有一种长度(可能出现两种情况,一种就是有多条链,但是长度都相同,或者只有一条链但是他们不管是合并还是留下来长度都是这个长度)因此则直接合并返回该长度,如果没有长度,说明dfs到底了返回0,如果有两种长度,这时就要记录下来这个位置,再dfs一次,因为该节点的父亲节点之上的链可能能够与该节点中的某一条链合并。如果有两种以上长度则直接-1

    Copy
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <vector>
    #include <cstring>
    #include <iomanip>
    #include <set>
    #include<ctime>
    #include<unordered_map>
    //CLOCKS_PER_SEC
    #define se second
    #define fi first
    #define ll long long
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define Pii pair<int,int>
    #define Pli pair<ll,int>
    #define ull unsigned long long
    #define pb push_back
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    const int N=1e6+10;
    const ull base=163;
    const int INF=0x3f3f3f3f;
    using namespace std;
    vector<int>vec[N];
    int root=-1;
    int dfs(int u,int fa){
        set<int>s;
        for(auto v:vec[u]){
            if(v!=fa){
                int tmp=dfs(v,u);
                if(tmp==-1)return -1;
                else s.insert(tmp+1);
            }
        }
        if(s.size()==0)return 0;
        else if(s.size()==1)return *s.begin();
        else if(s.size()==2&&fa==0)return *s.begin()+*s.rbegin();
        else if(s.size()==2&&fa!=0){
            root=u;
            return -1;
        }
        else return -1;
    }
    int main(){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n-1;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            vec[u].pb(v),vec[v].pb(u);
        }
        int ans=dfs(1,0);
        if(ans==-1&&root!=-1)ans=dfs(root,0);
        while(ans%2==0)ans/=2;
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    常见apache问题
    机器学习——SVM讲解
    剑指offer——05用两个栈实现队列(Python3)
    剑指offer——04重建二叉树(Python3)
    剑指offer——03从尾至头打印列表(Python3)
    剑指offer——02替换空格(Python3)
    剑指offer——01二维数组中的查找(Python3)
    剑指offer——06旋转数组的最小数字(Python3)
    一个Python项目的创建架构
    python中各项目文件含义(新手可看)
  • 原文地址:https://www.cnblogs.com/Mrleon/p/9098935.html
Copyright © 2011-2022 走看看