• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            算法學(xué)社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0
            題目描述:
                一棵N(N<5,000)個(gè)節(jié)點(diǎn)的樹,染兩種顏色,不同顏色不能相鄰且要給盡可能多的節(jié)點(diǎn)染色。求顏色A和顏色B可能的染色節(jié)點(diǎn)個(gè)數(shù)。
            算法分析:
                顯然是只有一個(gè)節(jié)點(diǎn)不染色的時(shí)候最優(yōu),之前要求出這個(gè)節(jié)點(diǎn)所有子樹的孩子的個(gè)數(shù),這個(gè)需要樹形DP。
                然后每個(gè)不染色的節(jié)點(diǎn),哪些孩子染哪些顏色,有多少不同的數(shù)量,這個(gè)是背包。
                然后讓我糾結(jié)的是,為啥大家都把背包當(dāng)水題做?
            #include<iostream>
            #include<cstdio>
            using namespace std;
            const int V = 5005;
            const int E = V<<1;
            int n,e,head[V],nxt[E],pnt[E];
            bool ans[V],dp[V][V];
            void add(int u,int v){
                nxt[e] = head[u]; head[u]=e;pnt[e] = v;e++;
            }
            int sum[V];
            void dfs(int u,int f){
                sum[u] = 1;
                dp[u][0] = 1;
                for(int i=head[u];i!=-1;i=nxt[i]){
                    int v = pnt[i];
                    if(v==f) continue;
                    dfs(v,u);
                    sum[u] += sum[v];
                    for(int i=n-1;i>=0;i--) 
                        if(dp[u][i])
                            dp[u][i + sum[v]] = 1;
                }
                int s = n-sum[u];
                for(int i=n-1;i>=0;i--)
                    if(dp[u][i]) dp[u][i+s] = 1;
            //    cout<<"u: "<<u<<endl;
            //    for(int i=0;i<n;i++) if(dp[u][i]) cout<<i<<" "; cout<<endl;
                for(int i=0;i<n;i++)
                    ans[i] |= dp[u][i];
            }
            int main(){
                scanf("%d",&n);
                for(int i=0;i<n;i++) head[i] = -1;
                int u,v;
                e = 0;
                for(int i=1;i<n;i++){
                    scanf("%d%d",&u,&v);
                    u--; v--;
                    add(u,v);
                    add(v,u);
                }
                dfs(0,0);
                int len = 0;
                for(int i=1;i<n-1;i++)
                    len += ans[i];
                printf("%d\n",len);
                for(int i=1;i<n-1;i++) if(ans[i]){
                    printf("%d %d\n",i,n-1-i);
                }
                return 0;
            }
            posted on 2012-07-21 22:47 西月弦 閱讀(286) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 解題報(bào)告
            国产成人精品综合久久久| 丰满少妇人妻久久久久久 | 免费一级欧美大片久久网| 久久久久人妻一区精品| 7777精品伊人久久久大香线蕉 | 国产成人精品久久二区二区| 久久国产乱子精品免费女| 久久久久噜噜噜亚洲熟女综合| 久久妇女高潮几次MBA| 青青青青久久精品国产h| 亚洲精品无码久久久| 国产∨亚洲V天堂无码久久久| 欧美亚洲另类久久综合婷婷 | 久久久亚洲欧洲日产国码二区| 青青热久久综合网伊人| 久久久久久免费视频| 久久婷婷国产麻豆91天堂| 亚洲va中文字幕无码久久不卡| 久久se这里只有精品| 激情伊人五月天久久综合| 欧美久久久久久| 久久99精品久久久久久9蜜桃| 99re久久精品国产首页2020| 2021国内久久精品| 亚洲性久久久影院| 武侠古典久久婷婷狼人伊人| 久久免费高清视频| 久久成人精品视频| 99国产欧美精品久久久蜜芽| 亚洲精品无码久久一线| 久久精品无码一区二区WWW| 热久久国产欧美一区二区精品| 伊人丁香狠狠色综合久久| 丰满少妇人妻久久久久久| av无码久久久久久不卡网站 | 久久99精品久久久久久野外| 91秦先生久久久久久久| 国产精品欧美久久久久无广告| 国产精品久久久久久久久| 久久久久久久尹人综合网亚洲| 久久最近最新中文字幕大全|