zoukankan      html  css  js  c++  java
  • 【CF1244D】Paint the Tree(树形DP,树)

    题意:

    n<=1e5,1<=a[i][j]<=1e9

    思路:

     不是很懂INF为什么要开到1e15,我觉得只要1e14就好

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 typedef long long ll;
      4 typedef unsigned int uint;
      5 typedef unsigned long long ull;
      6 typedef pair<int,int> PII;
      7 typedef pair<ll,ll> Pll;
      8 typedef vector<int> VI;
      9 typedef vector<PII> VII;
     10 //typedef pair<ll,ll>P;
     11 #define N  200010
     12 #define M  200010
     13 #define fi first
     14 #define se second
     15 #define MP make_pair
     16 #define pb push_back
     17 #define pi acos(-1)
     18 #define mem(a,b) memset(a,b,sizeof(a))
     19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
     20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
     21 #define lowbit(x) x&(-x)
     22 #define Rand (rand()*(1<<16)+rand())
     23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
     24 #define ls p<<1
     25 #define rs p<<1|1
     26 
     27 struct node
     28 {
     29     int x,y;
     30 }pre[N][3][3];
     31 
     32 ll dp[N][3][3];
     33 ll a[N][3];
     34 int head[N],vet[N],nxt[N],d[N],c[N],son[N],f[N],tot,n;
     35 
     36 int read()
     37 {
     38    int v=0,f=1;
     39    char c=getchar();
     40    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
     41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
     42    return v*f;
     43 }
     44 
     45 void add(int a,int b)
     46 {
     47     nxt[++tot]=head[a];
     48     vet[tot]=b;
     49     head[a]=tot;
     50 }
     51 
     52 void dfs(int u,int fa)
     53 {
     54     //printf("dfs u=%d fa=%d
    ",u,fa);
     55     int e=head[u],s=0;
     56     rep(i,0,2)
     57      rep(j,0,2) dp[u][i][j]=1e15;
     58     while(e)
     59     {
     60         int v=vet[e];
     61         if(v!=fa)
     62         {
     63             s++;
     64             son[u]=v;
     65             f[v]=u;
     66             dfs(v,u);
     67         }
     68         e=nxt[e];
     69     }
     70     if(u==1&&d[1]==2)
     71     {
     72         //printf("case 2
    ");
     73         return;
     74     }
     75 
     76     if(s==0)
     77     {
     78         rep(i,0,2)
     79          rep(j,0,2)
     80           if(i!=j) dp[u][i][j]=a[u][i];
     81     }
     82      else
     83      {
     84          int v=son[u];
     85          //printf("u=%d v=%d
    ",u,v);
     86          rep(i,0,2)
     87           rep(j,0,2)
     88            rep(k,0,2)
     89             if(i!=j&&j!=k&&i!=k)
     90             {
     91                 if(dp[u][i][j]>dp[v][j][k]+a[u][i])
     92                 {
     93                     dp[u][i][j]=dp[v][j][k]+a[u][i];
     94                     pre[u][i][j].x=j;
     95                     pre[u][i][j].y=k;
     96                 }
     97             }
     98 
     99      }
    100 
    101 
    102 }
    103 
    104 void print()
    105 {
    106     /*rep(i,1,n)
    107      rep(j,0,2)
    108       rep(k,0,2)
    109        if(j!=k) printf("i=%d j=%d k=%d dp[i][j][k]=%I64d
    ",i,j,k,dp[i][j][k]);*/
    110     if(d[1]==1)
    111     {
    112         ll ans=1e15;
    113         int x=0,y=0;
    114         rep(i,0,2)
    115          rep(j,0,2)
    116           if(i!=j&&dp[1][i][j]<ans)
    117           {
    118                 ans=dp[1][i][j];
    119                 x=i; y=j;
    120           }
    121         int u=1;
    122         while(u)
    123         {
    124             c[u]=x;
    125             int x1=pre[u][x][y].x;
    126             int y1=pre[u][x][y].y;
    127             u=son[u];
    128             x=x1,y=y1;
    129         }
    130         printf("%I64d
    ",ans);
    131         rep(i,1,n) printf("%d ",c[i]+1);
    132     }
    133      else
    134      {
    135          int k1=0,k2=0;
    136          rep(i,1,n)
    137           if(f[i]==1){k1=i; break;}
    138          per(i,n,1)
    139           if(f[i]==1){k2=i; break;}
    140          int x1,y1,x2,y2,z;
    141          ll ans=1e15;
    142          rep(i,0,2)
    143           rep(j,0,2)
    144            rep(k,0,2)
    145             rep(p,0,2)
    146              rep(q,0,2)
    147               if(i!=j&&i!=k&&j!=k&&j!=p&&p!=i&&i!=q&&k!=q&&dp[k1][j][p]+dp[k2][k][q]+a[1][i]<ans)
    148               {
    149                   ans=dp[k1][j][p]+dp[k2][k][q]+a[1][i];
    150                   z=i;
    151                   x1=j; y1=p;
    152                   x2=k; y2=q;
    153               }
    154          c[1]=z;
    155          int u=k1,x=x1,y=y1;
    156          while(u)
    157          {
    158              c[u]=x;
    159              int x1=pre[u][x][y].x;
    160              int y1=pre[u][x][y].y;
    161              u=son[u];
    162              x=x1,y=y1;
    163          }
    164          u=k2,x=x2,y=y2;
    165          while(u)
    166          {
    167              c[u]=x;
    168              int x1=pre[u][x][y].x;
    169              int y1=pre[u][x][y].y;
    170              u=son[u];
    171              x=x1,y=y1;
    172          }
    173          printf("%I64d
    ",ans);
    174          rep(i,1,n) printf("%d ",c[i]+1);
    175      }
    176 
    177 }
    178 
    179 int main()
    180 {
    181     //freopen("1.in","r",stdin);
    182     n=read();
    183     rep(j,0,2)
    184      rep(i,1,n) scanf("%I64d",&a[i][j]);
    185     rep(i,1,n) head[i]=d[i]=0;
    186     tot=0;
    187     rep(i,1,n-1)
    188     {
    189         int x=read(),y=read();
    190         add(x,y);
    191         add(y,x);
    192         d[x]++; d[y]++;
    193     }
    194     int flag=1;
    195     rep(i,1,n)
    196      if(d[i]>=3) flag=0;
    197     if(!flag)
    198     {
    199         printf("-1
    ");
    200         return 0;
    201     }
    202     dfs(1,0);
    203     print();
    204     return 0;
    205 }

     实际上只有1条或者2条从1下来的链,枚举1和与1相邻的颜色然后就能推出整条链

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 typedef long long ll;
      4 typedef unsigned int uint;
      5 typedef unsigned long long ull;
      6 typedef pair<int,int> PII;
      7 typedef pair<ll,ll> Pll;
      8 typedef vector<int> VI;
      9 typedef vector<PII> VII;
     10 //typedef pair<ll,ll>P;
     11 #define N  200010
     12 #define M  200010
     13 #define fi first
     14 #define se second
     15 #define MP make_pair
     16 #define pb push_back
     17 #define pi acos(-1)
     18 #define mem(a,b) memset(a,b,sizeof(a))
     19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
     20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
     21 #define lowbit(x) x&(-x)
     22 #define Rand (rand()*(1<<16)+rand())
     23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
     24 #define ls p<<1
     25 #define rs p<<1|1
     26 
     27 const ll MOD=1e9+7,inv2=(MOD+1)/2;
     28       double eps=1e-6;
     29       ll INF=1e15;
     30       int da[4]={-1,1,0,0};
     31       int db[4]={0,0,-1,1};
     32 
     33 struct node
     34 {
     35     int x,y;
     36 }pre[N][3][3];
     37 
     38 ll a[N][3];
     39 int head[N],vet[N],nxt[N],f[N],g[N],b[N],c[N],d[N],p[N],tot,son;
     40 
     41 int read()
     42 {
     43    int v=0,f=1;
     44    char c=getchar();
     45    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
     46    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
     47    return v*f;
     48 }
     49 
     50 void add(int a,int b)
     51 {
     52     nxt[++tot]=head[a];
     53     vet[tot]=b;
     54     head[a]=tot;
     55 }
     56 
     57 void dfs(int u,int fa)
     58 {
     59     int e=head[u];
     60     while(e)
     61     {
     62         int v=vet[e];
     63         if(v!=fa)
     64         {
     65             f[v]=u;
     66             g[u]=v;
     67             if(u==1)
     68             {
     69                 son++;
     70                 p[son]=v;
     71             }
     72             dfs(v,u);
     73         }
     74         e=nxt[e];
     75     }
     76 }
     77 
     78 int main()
     79 {
     80     //freopen("1.in","r",stdin);
     81     int n=read();
     82     rep(j,0,2)
     83      rep(i,1,n) scanf("%I64d",&a[i][j]);
     84     rep(i,1,n) head[i]=d[i]=0;
     85     tot=0;
     86     rep(i,1,n-1)
     87     {
     88         int x=read(),y=read();
     89         add(x,y);
     90         add(y,x);
     91         d[x]++; d[y]++;
     92     }
     93     int flag=1;
     94     rep(i,1,n)
     95      if(d[i]>=3) flag=0;
     96     if(!flag)
     97     {
     98         printf("-1
    ");
     99         return 0;
    100     }
    101     son=0;
    102     dfs(1,0);
    103     ll ans=INF;
    104     if(son==1)
    105     {
    106         rep(x,0,2)
    107         {
    108             int u=p[1];
    109             rep(y,0,2)
    110              if(x!=y)
    111              {
    112                 b[1]=x; b[u]=y;
    113                 int k=u;
    114                 while(k)
    115                 {
    116                     k=g[k];
    117                     if(!k) break;
    118                     b[k]=3-b[f[k]]-b[f[f[k]]];
    119                 }
    120                  ll s=0;
    121                  rep(i,1,n) s+=a[i][b[i]];
    122                  if(s<ans)
    123                  {
    124                     ans=s;
    125                     rep(i,1,n) c[i]=b[i];
    126                  }
    127              }
    128         }
    129     }
    130      else
    131      {
    132          int u1=p[1],u2=p[2];
    133          rep(x,0,2)
    134          rep(y,0,2)
    135           rep(z,0,2)
    136            if(x!=y&&x!=z&&y!=z)
    137            {
    138                 b[1]=x; b[u1]=y;
    139                 int k=u1;
    140                 while(k)
    141                 {
    142                     k=g[k];
    143                     if(!k) break;
    144                     b[k]=3-b[f[k]]-b[f[f[k]]];
    145                 }
    146                 b[u2]=z;
    147                 k=u2;
    148                 while(k)
    149                 {
    150                     k=g[k];
    151                     if(!k) break;
    152                     b[k]=3-b[f[k]]-b[f[f[k]]];
    153                 }
    154                 ll s=0;
    155                 rep(i,1,n) s+=a[i][b[i]];
    156                 if(s<ans)
    157                 {
    158                     ans=s;
    159                     rep(i,1,n) c[i]=b[i];
    160                 }
    161            }
    162      }
    163 
    164     printf("%I64d
    ",ans);
    165     rep(i,1,n) printf("%d ",c[i]+1);
    166     return 0;
    167 }
  • 相关阅读:
    排序算法---堆排序

    排序算法---希尔排序
    简单排序算法
    Jave 垃圾回收查看工具--jstat
    Linux 查看进程IO状态
    vittualenv 和mkvirtualenv
    服务器被当作了肉机去挖矿的解决办法
    pycharm的函数注释 和 父子组件传递
    git初始化操作
  • 原文地址:https://www.cnblogs.com/myx12345/p/11668902.html
Copyright © 2011-2022 走看看