• <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>


            May the force be with you!
            posts - 52,  comments - 33,  trackbacks - 0
              我對(duì)樹形DP早有耳聞,不過沒有做過相應(yīng)的題目。最近看集合DP不怎么懂,所以換看樹形DP,昨天看到一個(gè)題目AC了結(jié)果發(fā)現(xiàn)跟樹形DP的思想不太像,這道題目就完全是基礎(chǔ)的樹形DP題了,紀(jì)念一下,呵呵。

            題目來源:USACO 2002 February

            題目提交方式:POJ1947
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1947


            題目描述:
               對(duì)于一棵樹,問刪除一些邊使得它的一棵子樹正好有p個(gè)節(jié)點(diǎn),問最少要?jiǎng)h除多少邊?
            輸入:
                N(1<=N<=150),P(1<=P<=N),接下來是N-1條邊的描述(父親節(jié)點(diǎn)在前)。
            輸出:
                ANS(要?jiǎng)h除的最小邊數(shù))

            解題思路:
                建樹比較簡(jiǎn)單,然后就是設(shè)計(jì)狀態(tài)轉(zhuǎn)移方程:
                對(duì)于一個(gè)節(jié)點(diǎn)i:用函數(shù)f[i][j]表示以它為根節(jié)點(diǎn)能得到j(luò)個(gè)節(jié)點(diǎn)的子樹需要?jiǎng)h除的最小邊數(shù)。
                狀態(tài)轉(zhuǎn)移方程:f[i][j+k] = min(f[i][k]+f[c][j]), c為i的兒子節(jié)點(diǎn)。
                最后結(jié)果為根f[root][p]和f[i][p]+1(1<=i<=n)中的最小值。
            我的代碼:

              1 /*********************************************************************
              2 Author: littlekid
              3 Created Time: 2008-3-1 11:38:58
              4 Problem Source: POJ1947
              5 Description:
              6 ********************************************************************/
              7 # include <iostream>
              8 using namespace std;
              9 
             10 # define N 155
             11 
             12 # define TEST
             13 
             14 const int LARGE_NUMBER = 11111;
             15 
             16 typedef struct _node {
             17     _node *next;
             18     int id;
             19 };
             20 
             21 _node vect[ N ];
             22 int n, p, root, ans, f[ N ][ N ];
             23 
             24 void initialize(int n)
             25 {
             26     for (int i = 1; i <= n; i ++)
             27     {
             28         vect[i].id = 0;
             29         vect[i].next = NULL;
             30     }
             31 }
             32 
             33 void insert(int v, int u)
             34 {
             35     _node *p;
             36     p = new _node;
             37     p->id = u;
             38     p->next = vect[v].next;
             39     vect[v].next = p;
             40     vect[v].id ++;
             41 }
             42 
             43 void del(_node *p)
             44 {
             45     if (p == NULL) return ;
             46     del(p->next);
             47     delete p;
             48 }
             49 
             50 void clear(int n)
             51 {
             52     for (int i = 1; i <= n; i ++)
             53     {
             54         del(vect[i].next);
             55         vect[i].next = NULL;
             56     }
             57 }
             58 
             59 
             60 void init()
             61 {
             62     int s, t;
             63     int flag[n+1];
             64     memset(flag, false, sizeof(flag));
             65     for (int i = 1; i < n; i ++)
             66     {
             67         scanf("%d %d"&s, &t);
             68         insert(s, t);
             69         flag[t] = true;
             70     }
             71     t = 1;
             72     while (flag[t]) t ++;
             73     root = t;
             74 }
             75 
             76 void output()
             77 {
             78     printf("%d\n", ans);
             79 }
             80 
             81 void DFS(int now)
             82 {
             83     _node *= vect[now].next;
             84     int tmp;
             85     for (int i = 0; i <= p; i ++) f[now][i] = LARGE_NUMBER;
             86     f[now][1= vect[now].id; 
             87     q = vect[now].next;
             88     while (q != NULL)
             89     {
             90         DFS(q->id);
             91         for (int j = p-1; j >= 0; j --)
             92         {
             93             if (f[now][j] < LARGE_NUMBER)
             94             {
             95                 for (int k = 1; k < p; k ++)
             96                 {
             97                     if (f[q->id][k] < LARGE_NUMBER)
             98                     {
             99                         tmp = f[now][j] + f[q->id][k] -1;
            100                         if (tmp < f[now][j+k])
            101                         {
            102                             f[now][j+k] = tmp;
            103                         }
            104                     }
            105                 }
            106             }
            107         }
            108         q = q->next;;
            109     }
            110 }
            111 
            112 void dp()
            113 {
            114     DFS(root);
            115     
            116     #ifdef TEST
            117     for (int i = 1; i <= n; i ++)
            118     {
            119         for (int j = 1; j <= p; j ++)
            120         {
            121             cout << f[i][j] << " ";
            122         }
            123         cout << endl;
            124     }
            125     #endif
            126     
            127     ans = f[root][p];
            128     for (int i = 1; i <= n; i++)
            129     {
            130         if (f[i][p] < ans) ans = f[i][p]+1;
            131     }
            132 }
            133 
            134 int main()
            135 {
            136     while (scanf("%d %d"&n, &p) != EOF)
            137     {
            138         initialize(n);
            139         init();
            140         dp();
            141         output();
            142         clear(n);
            143     }
            144     return 0;
            145 }
            146 
            147 

            posted on 2008-03-01 14:16 R2 閱讀(3511) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Problem Solving

            FeedBack:
            # re: 【樹形DP】POJ1947 Rebuilding Roads 解題報(bào)告[未登錄]
            2009-09-24 21:37 | Simon
            怎么WA了。。。。
            無語(yǔ)。。。。
            lz得程序貌似有點(diǎn)問題阿   回復(fù)  更多評(píng)論
              
            你是第 free hit counter 位訪客




            <2007年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(4)

            隨筆分類(54)

            隨筆檔案(52)

            文章檔案(1)

            ACM/ICPC

            技術(shù)綜合

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 63340
            • 排名 - 355

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲国产精品人久久| 久久久久久曰本AV免费免费| 久久精品成人一区二区三区| 久久无码AV中文出轨人妻| 国产精品99久久免费观看| 久久综合久久性久99毛片| 99蜜桃臀久久久欧美精品网站| 国产精品久久永久免费| 亚洲国产一成久久精品国产成人综合 | 日韩亚洲欧美久久久www综合网| 久久久这里有精品| 亚洲国产精品人久久| 久久亚洲美女精品国产精品| 少妇久久久久久被弄到高潮| 国产精品久久国产精品99盘 | 久久不见久久见免费视频7| 久久综合给合综合久久| 久久精品九九亚洲精品天堂 | 久久免费看黄a级毛片| 久久精品国产72国产精福利| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久亚洲精品国产亚洲老地址 | 色婷婷综合久久久久中文| 一级女性全黄久久生活片免费| 国产激情久久久久影院老熟女免费| 久久久久久久久无码精品亚洲日韩| 四虎国产精品成人免费久久| 亚洲国产成人精品久久久国产成人一区二区三区综 | 欧美国产成人久久精品| 亚洲精品综合久久| 久久夜色精品国产www| 久久久亚洲精品蜜桃臀| 久久九九久精品国产| 亚洲精品无码久久毛片| 国产精品久久久香蕉| 日本加勒比久久精品| 最新久久免费视频| 精品久久久久久无码不卡| 久久精品国产免费观看| av色综合久久天堂av色综合在| 亚洲AV无码久久精品成人|