• bzoj1369 [Baltic2003]Gem


    传送门

    题目

    给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小。

    Input

    先给出一个数字N,代表树上有N个点,N<=10000 下面N-1行,代表两个点相连

    Output

    最小的总权值

    分析

    这个题最多有三种值(我也不知道为啥),在知道这个之后我们进行朴素的树形dp即可,dpij表示第i个点的值为j。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int dp[10010][10]; 
    vector<int>v[10010];
    inline void go(int x,int fa){
          dp[x][1]=1,dp[x][2]=2,dp[x][3]=3;
          for(int i=0;i<v[x].size();i++)
             if(v[x][i]!=fa){
                 go(v[x][i],x);
                 dp[x][1]+=min(dp[v[x][i]][2],dp[v[x][i]][3]);
                 dp[x][2]+=min(dp[v[x][i]][1],dp[v[x][i]][3]);
                 dp[x][3]+=min(dp[v[x][i]][1],dp[v[x][i]][2]);
             }
          return; 
    }
    int main()
    {     int n,m,i,j,k,x,y;
          scanf("%d",&n);
          for(i=1;i<n;i++){
              scanf("%d%d",&x,&y);
              v[x].push_back(y);
              v[y].push_back(x);
          }
          go(1,0);
          printf("%d
    ",min(dp[1][1],min(dp[1][2],dp[1][3])));
          return 0;
    }
  • 相关阅读:
    DRF(四)
    DRF----------(三)
    DRF--------(二)
    DRF(一)
    VUE(四)
    VUE(三)
    VUE(二)
    DRF 序列化组件 模型层中参数补充
    django中基于python3.6使用容联发送短信
    django-jwt token校验源码简析
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9198371.html
Copyright © 2020-2023  润新知