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;
    }
  • 相关阅读:
    测试
    扫描法作业
    线索二叉树【C语言】
    【数据结构】循环列表的基本操作
    【数据结构】C语言栈的基本操作
    [数据结构】【c语言】链表的创建和遍历
    PXC(Percona XtraDB Cluster)集群的安装与配置
    mysql数据库主从及主主复制配置演示
    基于keepalived双主模型的高可用LVS
    keepalived高可用反向代理的nginx
  • 原文地址:https://www.cnblogs.com/Mrleon/p/9098935.html
Copyright © 2011-2022 走看看