题意:

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

思路:

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

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
//typedef pair<ll,ll>P;
#define N 200010
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 struct node
{
int x,y;
}pre[N][][]; ll dp[N][][];
ll a[N][];
int head[N],vet[N],nxt[N],d[N],c[N],son[N],f[N],tot,n; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void dfs(int u,int fa)
{
//printf("dfs u=%d fa=%d\n",u,fa);
int e=head[u],s=;
rep(i,,)
rep(j,,) dp[u][i][j]=1e15;
while(e)
{
int v=vet[e];
if(v!=fa)
{
s++;
son[u]=v;
f[v]=u;
dfs(v,u);
}
e=nxt[e];
}
if(u==&&d[]==)
{
//printf("case 2\n");
return;
} if(s==)
{
rep(i,,)
rep(j,,)
if(i!=j) dp[u][i][j]=a[u][i];
}
else
{
int v=son[u];
//printf("u=%d v=%d\n",u,v);
rep(i,,)
rep(j,,)
rep(k,,)
if(i!=j&&j!=k&&i!=k)
{
if(dp[u][i][j]>dp[v][j][k]+a[u][i])
{
dp[u][i][j]=dp[v][j][k]+a[u][i];
pre[u][i][j].x=j;
pre[u][i][j].y=k;
}
} } } void print()
{
/*rep(i,1,n)
rep(j,0,2)
rep(k,0,2)
if(j!=k) printf("i=%d j=%d k=%d dp[i][j][k]=%I64d\n",i,j,k,dp[i][j][k]);*/
if(d[]==)
{
ll ans=1e15;
int x=,y=;
rep(i,,)
rep(j,,)
if(i!=j&&dp[][i][j]<ans)
{
ans=dp[][i][j];
x=i; y=j;
}
int u=;
while(u)
{
c[u]=x;
int x1=pre[u][x][y].x;
int y1=pre[u][x][y].y;
u=son[u];
x=x1,y=y1;
}
printf("%I64d\n",ans);
rep(i,,n) printf("%d ",c[i]+);
}
else
{
int k1=,k2=;
rep(i,,n)
if(f[i]==){k1=i; break;}
per(i,n,)
if(f[i]==){k2=i; break;}
int x1,y1,x2,y2,z;
ll ans=1e15;
rep(i,,)
rep(j,,)
rep(k,,)
rep(p,,)
rep(q,,)
if(i!=j&&i!=k&&j!=k&&j!=p&&p!=i&&i!=q&&k!=q&&dp[k1][j][p]+dp[k2][k][q]+a[][i]<ans)
{
ans=dp[k1][j][p]+dp[k2][k][q]+a[][i];
z=i;
x1=j; y1=p;
x2=k; y2=q;
}
c[]=z;
int u=k1,x=x1,y=y1;
while(u)
{
c[u]=x;
int x1=pre[u][x][y].x;
int y1=pre[u][x][y].y;
u=son[u];
x=x1,y=y1;
}
u=k2,x=x2,y=y2;
while(u)
{
c[u]=x;
int x1=pre[u][x][y].x;
int y1=pre[u][x][y].y;
u=son[u];
x=x1,y=y1;
}
printf("%I64d\n",ans);
rep(i,,n) printf("%d ",c[i]+);
} } int main()
{
//freopen("1.in","r",stdin);
n=read();
rep(j,,)
rep(i,,n) scanf("%I64d",&a[i][j]);
rep(i,,n) head[i]=d[i]=;
tot=;
rep(i,,n-)
{
int x=read(),y=read();
add(x,y);
add(y,x);
d[x]++; d[y]++;
}
int flag=;
rep(i,,n)
if(d[i]>=) flag=;
if(!flag)
{
printf("-1\n");
return ;
}
dfs(,);
print();
return ;
}

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

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
//typedef pair<ll,ll>P;
#define N 200010
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
ll INF=1e15;
int da[]={-,,,};
int db[]={,,-,}; struct node
{
int x,y;
}pre[N][][]; ll a[N][];
int head[N],vet[N],nxt[N],f[N],g[N],b[N],c[N],d[N],p[N],tot,son; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void dfs(int u,int fa)
{
int e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa)
{
f[v]=u;
g[u]=v;
if(u==)
{
son++;
p[son]=v;
}
dfs(v,u);
}
e=nxt[e];
}
} int main()
{
//freopen("1.in","r",stdin);
int n=read();
rep(j,,)
rep(i,,n) scanf("%I64d",&a[i][j]);
rep(i,,n) head[i]=d[i]=;
tot=;
rep(i,,n-)
{
int x=read(),y=read();
add(x,y);
add(y,x);
d[x]++; d[y]++;
}
int flag=;
rep(i,,n)
if(d[i]>=) flag=;
if(!flag)
{
printf("-1\n");
return ;
}
son=;
dfs(,);
ll ans=INF;
if(son==)
{
rep(x,,)
{
int u=p[];
rep(y,,)
if(x!=y)
{
b[]=x; b[u]=y;
int k=u;
while(k)
{
k=g[k];
if(!k) break;
b[k]=-b[f[k]]-b[f[f[k]]];
}
ll s=;
rep(i,,n) s+=a[i][b[i]];
if(s<ans)
{
ans=s;
rep(i,,n) c[i]=b[i];
}
}
}
}
else
{
int u1=p[],u2=p[];
rep(x,,)
rep(y,,)
rep(z,,)
if(x!=y&&x!=z&&y!=z)
{
b[]=x; b[u1]=y;
int k=u1;
while(k)
{
k=g[k];
if(!k) break;
b[k]=-b[f[k]]-b[f[f[k]]];
}
b[u2]=z;
k=u2;
while(k)
{
k=g[k];
if(!k) break;
b[k]=-b[f[k]]-b[f[f[k]]];
}
ll s=;
rep(i,,n) s+=a[i][b[i]];
if(s<ans)
{
ans=s;
rep(i,,n) c[i]=b[i];
}
}
} printf("%I64d\n",ans);
rep(i,,n) printf("%d ",c[i]+);
return ;
}

【CF1244D】Paint the Tree(树形DP,树)的更多相关文章

  1. E. Paint the Tree 树形dp

    E. Paint the Tree 题目大意:给你一棵树,每一个点都可以染k种颜色,你拥有无数种颜色,每一种颜色最多使用2次,如果一条边的两个节点拥有同一种颜色,那么就说 这条边是饱和的,一个树的价值 ...

  2. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  3. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  4. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  5. hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

    /** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...

  6. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  7. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  8. POJ 1655.Balancing Act 树形dp 树的重心

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14550   Accepted: 6173 De ...

  9. 5.10 省选模拟赛 tree 树形dp 逆元

    LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...

  10. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

随机推荐

  1. 【Unity Shader】---入门知识点

    着色器声明(“名字”)Shader "ShaderDiffuseExample" { 一.属性定义(作用:外部传入参数) 属性定义语法:PropName("Display ...

  2. 分布式ID生成器 snowflake(雪花)算法

    在springboot的启动类中引入 @Bean public IdWorker idWorkker(){ return new IdWorker(1, 1); } 在代码中调用 @Autowired ...

  3. js技巧之与或运算符 || && 妙用

    如题: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头:  成长速度为10显示2个箭头:  成长速度为12显示3个箭头:  成长速度为15显示4个箭头:  其他都显示都显示0各箭头.  用代码 ...

  4. [Python3 填坑] 010 isalpha() 对于字母的定义

    目录 1. print( 坑的信息 ) 2. 开始填坑 官方文档 1. print( 坑的信息 ) 挖坑时间:2019/01/14 明细 坑的编码 内容 Py009-1 isalpha() 理当只有输 ...

  5. HDU2112 HDUToday

    HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. Reactjs 列表优化的一些心得

    前言 在应用开发中,列表是我们使用频率非常高的一种展现形式,在reactjs项目中更是如此.无处不在的使用更是需要我们小心触发性能瓶颈的深水炸弹. 下面就我最近的总结出的几点心得分享给大家,有什么问题 ...

  7. 将图片地址转为blob格式的例子

    HTML代码: <div id="forAppend" class="demo"></div> Javascript代码: <sc ...

  8. javascript(DOM)实例

    JavaScript学习笔记 JS补充笔记 实例之跑马灯,函数创建.通过ID获取标签及内部的值,字符串的获取与拼接.定时器的使用 使用定时器实现在console中打印内容 Dom选择器使用与调试记录 ...

  9. 加秘钥的SSH

    import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa31.txt') # 创建SSH对象 ssh = ...

  10. 刚新建好的动态网站项目,创建jsp页面就报错??

    拿到刚刚可以运行的Eclipse,就马上想敲码了,但一创建项目之后再创建jsp页面就报错= =! 报错的内容大概为缺乏对应的jar包. 我们常用Tomcat为中间体,而他本身是带有开发jsp网站的对应 ...