• <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
               今天切了一道被推薦為樹形DP的題目,想了一會就想出方法了,不過調(diào)了不少時間。感覺這個題目只是一個普通的樹的題目,不過如果這也算樹形DP的話,就是我的第一道(值得紀(jì)念了)


            題目模型描述:
            有N個節(jié)點,每個節(jié)點有一個權(quán)值,這N個節(jié)點通過M條邊連解,任意兩個點之間有且只有一條路徑——就是樹了!(1 ≤ N ≤ 100000, 1 ≤ M ≤ 1000000),將其分為兩棵樹,使得這兩棵樹的權(quán)值相差最小,求這個最小值。

            解題過程:
            我開始一直以為這個題目很難——畢竟是樹形DP,后面推出這個題目可以通過DFS來做,然后寫了,交上去得到TLE,然后我懷疑方法不對,不過我刪去了最后的刪掉鄰接鏈表的操作后得到WA,這樣我繼續(xù)調(diào)試,看了DISCUSS發(fā)現(xiàn)要用Int64,這樣就AC了,但是效率不夠……不過先發(fā)在這里,下午再去找人問高效的算法……

            這個題目注意的地方(對于我的算法):

            注意數(shù)據(jù)大小不能為int,這樣會wa

            建樹時得到的鄰接鏈表在用完后不要一個一個去delete,這樣會TLE

            對于N=1的情況,可以認(rèn)為還有一組0個

              1 /*********************************************************************
              2 Author: littlekid
              3 Created Time: 2008-2-29 11:56:06
              4 Problem Source: POJ3140
              5 Description:
              6 
              7 ********************************************************************/
              8 
              9 # include <iostream>
             10 using namespace std;
             11 
             12 # define N 100010
             13 
             14 typedef struct _node {
             15     _node *next;
             16     int id;
             17 };
             18 
             19 _node vect[ N ];
             20 __int64 num[ N ], f[ N ], ans, tot;
             21 int n, m;
             22 bool flag[ N ];
             23 
             24 void initialize(int n)
             25 {
             26     for (int i = 1; i <= n; i ++)
             27     {
             28         vect[i].next = NULL;
             29     }
             30 }
             31 
             32 void insert(int v, int u)
             33 {
             34     _node *p;
             35     p = new _node;
             36     p->id = u;
             37     p->next = vect[v].next;
             38     vect[v].next = p;
             39     p = new _node;
             40     p->id = v;
             41     p->next = vect[u].next;
             42     vect[u].next = p;
             43 }
             44 /*
             45 void del(_node *p)
             46 {
             47     if (p == NULL) return ;
             48     del(p->next);
             49     delete p;
             50 }
             51 
             52 void clear(int n)
             53 {
             54     for (int i = 1; i <= n; i ++)
             55     {
             56         del(vect[i].next);
             57         vect[i].next = NULL;
             58     }
             59 }
             60 */
             61 
             62 void init()
             63 {
             64     tot = 0;
             65     for (int i = 1; i <= n; i ++)
             66     {
             67         scanf("%I64d"&num[i]);
             68         tot += num[i];
             69     }
             70     ans = tot;
             71 
             72     memset(flag, false, sizeof(flag));
             73     int s, t;
             74     for (int i = 1; i <= m; i ++)
             75     {
             76         scanf("%d %d"&s, &t);
             77         insert(s, t);
             78     }
             79 }
             80 
             81 void output(int ca)
             82 {
             83     printf("Case %d: %I64d\n", ca, ans);
             84 }
             85 
             86 __int64 DFS(int now)
             87 {
             88     if (ans < 2return tot;
             89     f[ now ] = num[now];
             90     _node *= vect[now].next;
             91     flag[now] = true;
             92     while (p != NULL)
             93     {
             94         if (!flag[p->id]) f[now] += DFS(p->id);
             95         p = p->next;
             96     }
             97     __int64 tmp = abs(tot - 2*f[now]);
             98     if (tmp < ans) ans = tmp;
             99     return f[ now ];
            100 }
            101 
            102 int main()
            103 {
            104     int ca = 0;
            105     while (true)
            106     {
            107         scanf("%d %d"&n, &m);
            108         if (n == 0 && m == 0break; ca ++;
            109         initialize(n);
            110         init();
            111         DFS(1);
            112         output(ca);
            113     //    clear(n);
            114     }
            115     return 0;
            116 }
            117 
            118 


            posted on 2008-02-29 14:09 R2 閱讀(477) 評論(0)  編輯 收藏 引用 所屬分類: Problem Solving
            你是第 free hit counter 位訪客




            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(4)

            隨筆分類(54)

            隨筆檔案(52)

            文章檔案(1)

            ACM/ICPC

            技術(shù)綜合

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 63717
            • 排名 - 357

            最新評論

            閱讀排行榜

            評論排行榜

            免费精品国产日韩热久久| 2021最新久久久视精品爱| 99久久免费国产精品热| 国产精品一区二区久久| 久久国产成人精品国产成人亚洲| 久久久久久久久久免免费精品| 精产国品久久一二三产区区别 | 综合久久给合久久狠狠狠97色 | 久久午夜综合久久| 777午夜精品久久av蜜臀| 狠狠色丁香久久综合婷婷| 亚洲伊人久久成综合人影院 | 久久亚洲精精品中文字幕| 93精91精品国产综合久久香蕉| 久久午夜夜伦鲁鲁片免费无码影视 | 色综合久久88色综合天天 | 99久久精品免费看国产一区二区三区 | 国内精品久久久久久99蜜桃| 亚洲精品97久久中文字幕无码| 久久精品欧美日韩精品| 久久精品国产男包| 久久这里只有精品视频99| 久久99免费视频| 久久精品国产清高在天天线| 亚洲国产综合久久天堂 | 久久人人妻人人爽人人爽| 久久伊人色| 久久精品国产WWW456C0M| 青青草国产成人久久91网| av午夜福利一片免费看久久| 亚洲中文字幕无码一久久区| 久久亚洲国产最新网站| 久久久99精品成人片中文字幕| 亚洲国产精品久久66| 久久亚洲国产午夜精品理论片| 91精品国产高清久久久久久io| 久久久久人妻一区精品色| 99久久精品午夜一区二区| 久久亚洲精品中文字幕三区| 91精品国产91久久久久久| 久久久久99精品成人片牛牛影视 |