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

            pku 1935 Journey 樹形DP

            簡明題意:給出一個城市的道路網(wǎng)(是一棵樹),每條路有一定的權(quán)值,一個人在第k點,給出一些城市列表,問這個人游覽完這些城市最小花費為多少
            解法:一條最優(yōu)的路線肯定是這樣

            有且僅有一條路線是單向的。
            下面定義狀態(tài):
            dp[i][0]為游覽完以i為根節(jié)點的子樹(僅僅游覽需要游覽的城市,如果沒有即為0)且最后回到i節(jié)點需要的最短長度
            dp[i][1]為不需要回到i節(jié)點的最短長度
            dp[i][0]=sum(dp[j][0]+val[i][j](如果dp[j][0]不為0或者j為需要訪問的城市)),j為i的孩子節(jié)點
            dp[i][1]=dp[i][0]-max(dp[j][0]-dp[j][1]+val[i][j](如果dp[j][0]不為0或者j為需要訪問的城市))
            最后結(jié)果就是dp[start][1]
            程序如下
             1# include <cstdio>
             2# include <cstring>
             3# include <vector>
             4//# include <algorithm>
             5using namespace std;
             6# define max(a,b) ((a)>(b)?(a):(b))
             7int dp[50001][2];
             8bool need[50001];
             9int g[50001],nxt[100005],val[100005],v[100005],c=0;
            10inline void insert(int a,int b,int p)
            11{
            12   v[c]=b;
            13   val[c]=p;
            14   nxt[c]=g[a];
            15   g[a]=c++;
            16}

            17void solve(int pos,int pre)
            18{
            19     int maxnum=0;
            20     dp[pos][0]=dp[pos][1]=0;
            21     for(int p=g[pos];p!=-1;p=nxt[p])
            22       if(v[p]!=pre)
            23       {
            24          solve(v[p],pos);
            25          maxnum=max(dp[v[p]][0]-dp[v[p]][1]+(dp[v[p]][0]||need[v[p]]?val[p]:0),maxnum);
            26          dp[pos][0]+=dp[v[p]][0]+(dp[v[p]][0]||need[v[p]]?2*val[p]:0);
            27       }

            28     dp[pos][1]=dp[pos][0]-maxnum;
            29}

            30int main()
            31{
            32    int n,start,num;
            33    scanf("%d%d",&n,&start);
            34    memset(g,-1,sizeof(g));
            35    memset(need,false,sizeof(need));
            36    memset(dp,-1,sizeof(dp));
            37    for(int i=1;i<n;i++)
            38    {
            39       int a,b,p;
            40       scanf("%d%d%d",&a,&b,&p);
            41       insert(a,b,p);
            42       insert(b,a,p);
            43    }

            44    scanf("%d",&num);
            45    while(num--)
            46    {
            47      int t;
            48      scanf("%d",&t);
            49      need[t]=true;
            50    }

            51    solve(start,-1);
            52    printf("%d\n",dp[start][1]);
            53   // system("pause");
            54    return 0;
            55}

            56
            57

            posted on 2010-11-16 02:06 yzhw 閱讀(161) 評論(0)  編輯 收藏 引用 所屬分類: DPgraph

            <2010年11月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導(dǎo)航

            統(tǒng)計

            公告

            統(tǒng)計系統(tǒng)

            留言簿(1)

            隨筆分類(227)

            文章分類(2)

            OJ

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            国产成人无码精品久久久性色| 97精品伊人久久久大香线蕉| 99久久婷婷国产一区二区| 色综合久久无码五十路人妻| 久久久人妻精品无码一区| 久久综合伊人77777| 久久亚洲国产成人影院网站 | 久久精品国产亚洲av高清漫画| 日韩欧美亚洲国产精品字幕久久久 | 精品久久久久久亚洲精品| 久久精品aⅴ无码中文字字幕不卡| 亚洲国产一成人久久精品| 亚洲精品乱码久久久久久中文字幕| 精品久久人人爽天天玩人人妻| 久久久精品久久久久影院| 99久久无色码中文字幕人妻| 国内精品久久久久久久久电影网| 亚洲成色WWW久久网站| 久久国产精品99精品国产| A级毛片无码久久精品免费| 久久精品18| 三上悠亚久久精品| 免费精品99久久国产综合精品| 久久久久久久国产免费看| 久久久国产视频| 伊人久久免费视频| 精品无码久久久久国产动漫3d| 久久夜色精品国产噜噜噜亚洲AV| 欧美伊香蕉久久综合类网站| 久久亚洲精品国产亚洲老地址| 精品无码久久久久国产| 久久久久亚洲av毛片大| 久久AV高潮AV无码AV| 欧美精品一区二区精品久久| 亚洲欧美国产日韩综合久久| 久久精品夜夜夜夜夜久久| 久久夜色撩人精品国产| 99久久精品费精品国产一区二区 | 久久夜色精品国产网站| 天天影视色香欲综合久久| 久久99热只有频精品8|