• <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>
            算法學社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0
            題目描述:
                一棵N(N<5,000)個節點的樹,染兩種顏色,不同顏色不能相鄰且要給盡可能多的節點染色。求顏色A和顏色B可能的染色節點個數。
            算法分析:
                顯然是只有一個節點不染色的時候最優,之前要求出這個節點所有子樹的孩子的個數,這個需要樹形DP。
                然后每個不染色的節點,哪些孩子染哪些顏色,有多少不同的數量,這個是背包。
                然后讓我糾結的是,為啥大家都把背包當水題做?
            #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 西月弦 閱讀(292) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
            国产AV影片久久久久久| 乱亲女H秽乱长久久久| 久久午夜福利电影| 国产精品美女久久福利网站| 欧美一区二区久久精品| 久久精品国产免费观看三人同眠| 人妻精品久久无码区| 青青青青久久精品国产 | 精品综合久久久久久888蜜芽| 美女写真久久影院| 亚洲精品白浆高清久久久久久| 国产精品99久久精品爆乳| 久久久一本精品99久久精品88| 91麻豆精品国产91久久久久久| 东方aⅴ免费观看久久av| 国产巨作麻豆欧美亚洲综合久久| 日本人妻丰满熟妇久久久久久| 久久人妻少妇嫩草AV蜜桃| 久久国产乱子伦精品免费强| 久久精品中文字幕一区| 久久天天躁狠狠躁夜夜不卡 | 996久久国产精品线观看| 色播久久人人爽人人爽人人片aV | 一级做a爰片久久毛片人呢| 久久国产劲爆AV内射—百度| 久久久中文字幕日本| 亚洲一区二区三区日本久久九| 国产精品无码久久久久久| 色偷偷偷久久伊人大杳蕉| 久久人人爽人人爽人人片AV麻烦 | 久久99精品久久久久久动态图| 国产精品久久久久久久人人看| 色诱久久av| 亚洲国产天堂久久久久久| 精品久久久久久久久久久久久久久 | 国内精品久久久久久久影视麻豆 | 日本高清无卡码一区二区久久 | 久久久久亚洲精品无码网址| 久久人人爽人人精品视频| 久久久青草青青国产亚洲免观| 日韩精品久久久久久|