• <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個(gè)節(jié)點(diǎn)(N<2,500)的帶權(quán)樹(shù)。現(xiàn)在割去一條邊,加到其他節(jié)點(diǎn)上,并保證也是一棵樹(shù)。問(wèn)最小的直徑是多少?

            算法分析:

                枚舉每條邊。樹(shù)形DP求出割掉這條邊后,每個(gè)節(jié)點(diǎn)可以到的最遠(yuǎn)距離。
                樹(shù)形DP是萬(wàn)能的!!!!
            #include<iostream>
            #include<cstdio>
            using namespace std;
            // build graph
            const int V = 2500 + 5;
            const int E = V*2;
            int head[V], nxt[E], pnt[E], cost[E], e, n;
            void add(int u,int v,int c){
                pnt[e] = v; cost[e] = c;
                nxt[e] = head[u]; head[u] = e; e++;
            }
            // tree dp
            const int inf = ~0u>>2;
            int mx[V], sd[V];
            void dfs(int u,int f){
                mx[u]= 0; 
                sd[u] = 0;
                for(int i = head[u]; i!=-1; i=nxt[i]) {
                    int v = pnt[i];
                    if(v == f) continue;
                    dfs(v,u);
                    if(cost[i] + mx[v] > mx[u]) {
                        sd[u] = mx[u];
                        mx[u] = cost[i] + mx[v];
                    }
                    else if(cost[i] + mx[v] > sd[u])
                        sd[u] = cost[i] + mx[v];
                }
            }
            int temp, flag;
            void dfs1(int u,int f) {
            //    cout<<"u: "<<u<<" "<<mx[u]<<" "<<sd[u]<<endl;
                if(mx[u] < temp) temp = mx[u];
                if(mx[u] > flag) flag = mx[u];
                for(int i = head[u]; i!=-1; i=nxt[i]) {
                    int v = pnt[i];
                    if(v == f) continue;
            //        cout<<"v: "<<v<<" "<<mx[v]<<endl;
                    if(mx[v] + cost[i] < mx[u])
                        mx[v] = mx[u] + cost[i];
                    else if(cost[i] + sd[u] > mx[v]){
                        mx[v] = cost[i] + sd[u];
                    }
                    else if(cost[i] + sd[u] > sd[v]){
                        sd[v] = cost[i] + sd[u];
                    }
                    dfs1(v,u);
                }
            }
            // main
            int main(){
                int test;
                scanf("%d", &test);
                for(int _ = 1; _ <= test; _ ++){
                    scanf("%d",&n);
                    int u,v,c;
                    //init
                    for(int i=0;i<n;i++) head[i] = -1;
                    e = 0;
                    // input
                    for(int i=1;i<n;i++) {
                        scanf("%d%d%d",&u,&v,&c);
                        add(u,v,c);
                        add(v,u,c);
                    }
                    int ans = inf;
                    for(int i=0;i<e;i+=2){
                        int u = pnt[i], v = pnt[i^1], mn = cost[i], mx1, mx2;
                        temp = inf;
                        flag = 0;
                        dfs(u,v); dfs1(u,v);
                        mn += temp;
                        mx1 = flag;
            //            cout<<temp<<endl;
                        temp = inf;
                        flag = 0;
                        dfs(v,u); dfs1(v,u);
                        mn += temp;
                        mx2 = flag;
                        mn = max(max(mx1,mx2),mn);
            //            cout<<temp<<endl;
                        if(mn < ans) ans = mn; 
                    }
                    printf("Case %d: %d\n",_,ans);
                }
            }
            posted on 2012-07-29 14:57 西月弦 閱讀(239) 評(píng)論(3)  編輯 收藏 引用

            FeedBack:
            # re: hdu 3721 樹(shù)形DP
            2012-07-31 09:56 | wuyiqi
            你是怎么描述切掉一條邊,補(bǔ)到另外兩個(gè)點(diǎn)上的,沒(méi)看懂
              回復(fù)  更多評(píng)論
              
            # re: hdu 3721 樹(shù)形DP
            2012-07-31 20:05 | 西月弦
            @wuyiqi
            比如我要割掉邊(u,v),那么我就對(duì)以u(píng)為根的子樹(shù)和以v為根的子樹(shù)分別搜索并樹(shù)形dp,且保證不通過(guò)(u,v)。
            那么新的樹(shù)的直徑要么是子樹(shù)u的直徑,要么是子樹(shù)v的直徑。要么是u的最小dp值 + v的最小dp值加(u,v)邊權(quán)。

            ps: 你們多校怎么那么猛。。。 Orz....  回復(fù)  更多評(píng)論
              
            # re: hdu 3721 樹(shù)形DP
            2012-08-01 23:05 | wu
            @西月弦
            懂了。
            我們一隊(duì)比較強(qiáng)吧,這兩次好像都在前10,我的隊(duì)不是很穩(wěn)定
              回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久精品无码一区二区三区| 亚洲精品高清久久| 久久综合成人网| 亚洲国产精品无码久久九九| 伊人色综合九久久天天蜜桃 | 99国产欧美精品久久久蜜芽| 91精品国产91久久久久福利| 9久久9久久精品| 亚洲美日韩Av中文字幕无码久久久妻妇| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 婷婷综合久久狠狠色99h| 久久久久成人精品无码| 欧美日韩精品久久久久| 欧美va久久久噜噜噜久久| 久久精品国产69国产精品亚洲| 婷婷久久精品国产| 亚洲av伊人久久综合密臀性色| 精品久久久噜噜噜久久久| 久久夜色精品国产| 国产精品久久久久影视不卡| 欧美国产成人久久精品| 无码伊人66久久大杳蕉网站谷歌| 国产一区二区三精品久久久无广告 | 久久亚洲精品中文字幕三区| 久久黄视频| 久久91精品国产91| 伊人色综合久久天天| 伊人久久大香线蕉综合Av| 久久超碰97人人做人人爱| 久久精品国产亚洲精品| AA级片免费看视频久久| 99久久精品影院老鸭窝| 久久久久人妻精品一区二区三区| 伊人久久大香线蕉综合热线| 免费一级做a爰片久久毛片潮| 国产精品成人精品久久久 | 精品乱码久久久久久夜夜嗨 | 一本久道久久综合狠狠爱| 久久丝袜精品中文字幕| 国产精品激情综合久久| 国产成人无码精品久久久久免费 |