zoukankan      html  css  js  c++  java
  • 树形dp——游族杯 D

    只有三种情况:全是1,有一个2的,只有一个点的

    树形dp求最长的1链,或者带一个2的最长1链即可

    #include<bits/stdc++.h>
    #define rep(i,x,y) for(auto i=(x);i<=(y);++i)
    #define dep(i,x,y) for(auto i=(x);i>=(y);--i)
    using namespace std;
    typedef long long ll;
    typedef pair<int,int>pii;
    const int N=2e6+10;
    const int inf=1e9;
    const int mo=998244353;
    int l1=1,l2=1,fa[N],f[N],g[N],a[N];
    vector<int>p[N];
    void dfs(int x){
        if(a[x]==1)f[x]=1;else f[x]=0; // 不许有2
        if(a[x]<=2)g[x]=1;else g[x]=0;// 允许有一个2
        for(auto&i:p[x])if(i!=fa[x]){
            fa[i]=x;dfs(i);
            if(a[x]==1){
                l1=max(l1,f[i]+f[x]);
                l2=max(l2,max(f[i]+g[x],g[i]+f[x]));
                f[x]=max(f[x],f[i]+1);
                g[x]=max(g[x],g[i]+1);
            }
            if(a[x]==2){
                l2=max(l2,f[i]+g[x]);
                g[x]=max(g[x],f[i]+1);
            }
        }
    }
    int main(){int n;
        scanf("%d",&n);
        rep(i,2,n){int x,y;
            scanf("%d%d",&x,&y);
            p[x].push_back(y);p[y].push_back(x);
        }int mi=inf;
        rep(i,1,n){
            scanf("%d",&a[i]);
            mi=min(mi,a[i]);
            if(!a[i]){
                printf("0/1
    ");return 0;
            }
        }
        if(mi>1){
            printf("%d/1
    ",mi);return 0;
        }
        dfs(1);
        if(l2<=l1*2)printf("1/%d
    ",l1);
        else{
            cout<<2<<'/'<<l2<<'
    ';
        }
    }
  • 相关阅读:
    debian修改crontab默认编辑器为vim
    正确用DD测试磁盘读写速度
    西数WD2T硬盘分区对齐的方法
    优化UITableView
    登录功能验证处理
    登录注册界面
    navigationbar
    tab bar controller
    ios之coretext
    ios之coredata
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12945010.html
Copyright © 2011-2022 走看看