南宁网站定制公司,下载百度app下载,抽奖的网站怎么做的,湖南宣传片制作公司正题 题目大意
一棵树#xff0c;可以增长边权长度#xff0c;要求根节点要每个叶子节点路径长度相等#xff0c;求最少增加次数。 解题思路
肯定优先修改上面的边#xff0c;因为这样可以影响最多的点#xff0c;那么对于每个节点我们都要使它到每个它子树中叶子节点的…正题 题目大意
一棵树可以增长边权长度要求根节点要每个叶子节点路径长度相等求最少增加次数。 解题思路
肯定优先修改上面的边因为这样可以影响最多的点那么对于每个节点我们都要使它到每个它子树中叶子节点的长度相等就好了。直接树形dpdpdp。 codecodecode
#includecstdio
#includealgorithm
#define ll long long
using namespace std;
const ll N500010;
struct node{ll to,w,next;
}a[N*2];
ll ls[N],tot,last[N],f[N],s,n;
void addl(ll x,ll y,ll w)
{a[tot].toy;a[tot].ww;a[tot].nextls[x];ls[x]tot;
}
void dp(ll x,ll fa,ll w)
{last[x]w;for(ll ils[x];i;ia[i].next){ll ya[i].to;if(yfa) continue;dp(y,x,wa[i].w);last[x]max(last[y],last[x]);}for(ll ils[x];i;ia[i].next){ll ya[i].to;if(yfa) continue;f[x]f[y];if(last[y]last[x])f[x]last[x]-last[y];}
}
int main()
{scanf(%lld%lld,n,s);for(ll i1;in;i){ll x,y,w;scanf(%lld%lld%lld,x,y,w);addl(x,y,w);addl(y,x,w);}dp(s,0,0);printf(%lld,f[s]);
}