当前位置: 首页 > news >正文

电商网站100排行榜/个人网站搭建

电商网站100排行榜,个人网站搭建,无代码编程的应用场景,公司网站怎么做站外链接题目的大意是&#xff1a;有一棵N个节点的树(N<10000)&#xff0c;树的每一条边都有一个边权&#xff0c;求这棵树上每个节点的最长链长。 用树形dp来写&#xff0c;dp[i]代表第i个节点的最长链的长度&#xff0c;dp1[i]代表第i个节点在其和其子树上的最长链的长度&#xff…

题目的大意是:有一棵N个节点的树(N<10000),树的每一条边都有一个边权,求这棵树上每个节点的最长链长。

用树形dp来写,dp[i]代表第i个节点的最长链的长度,dp1[i]代表第i个节点在其和其子树上的最长链的长度,dp3[[i]代表第i个节点向上的最长链的长度,这样我们写出转移方程:

dp[i] = max(dp1[i],dp3[i])。 

dp1[i]我们只需要一次最简单的dfs从根(1)遍历到叶子节点就好了,dp3[i]要怎么求?dp3[i]代表第i个节点往上的最长链,我们在往上找i的根节点fa[i],不妨叫做fa。那么dp3[i]的的值就是dp3[fa]和fa节点往下(除了i节点以外的子树的最长链),这个时候我们就需要一个dp2[i]代表第i个节点及其子树的第二长链。这样我们得到dp3[i]的转移方程;

dp3[i] = max{dp3[fa],g[fa][i]+dp1[i] == dp1[fa] ? dp2[fa]:dp1[fa]}+g[fa][i]。其中g[fa][i]代表的是边的权值:

这样我们在用一个dfs来遍历得到所有的dp3[i],dp2[i]可以再得到dp1[i]是得到,下面是ac代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#define ll long long
#define FOR(i,x,y) for(int i = x;i < y;i ++)
#define INF 1<<31using namespace std;const int MAXN = 11111;int dp1[MAXN],dp2[MAXN],dp3[MAXN],dp[MAXN];
int N;
vector <pair<int,int> > G[MAXN];
//得到dp1[i],dp2[i]
int dfs1(int u,int fa){dp1[u] = 0; dp2[u] = 0;int tem[MAXN],tem_cnt = 0;vector <pair<int,int> > :: iterator it;for(it = G[u].begin();it != G[u].end();it ++){int v = it->first,val = it->second;if(v == fa) continue;tem[tem_cnt++] = val+dfs1(v,u);}sort(tem,tem+tem_cnt);if(tem_cnt >= 2){dp1[u] = tem[tem_cnt-1];    dp2[u] = tem[tem_cnt-2];}else if(tem_cnt == 1)   dp1[u] =tem[tem_cnt-1];return dp1[u];
}
//求出所有dp3[i],其实这里就可以求出dp[i]了
void dfs3(int u,int fa){vector <pair<int,int> > :: iterator it;for(it = G[u].begin();it != G[u].end();it ++){int v = it->first,val = it->second;if(v == fa) continue;if(dp1[u] == dp1[v]+val)    dp3[v] = max(dp2[u],dp3[u]) + val;else    dp3[v] = max(dp1[u],dp3[u]) + val;dfs3(v,u);}
}int main()
{//freopen("test.in","r",stdin);while(~scanf("%d",&N)){FOR(i,1,N+1) G[i].clear();int to,val; //val代表的是编的权值FOR(i,2,N+1){scanf("%d%d",&to,&val);G[i].push_back(make_pair(to,val));G[to].push_back(make_pair(i,val));}dfs1(1,-1);dp3[1] = 0;dfs3(1,-1);FOR(i,1,N+1)    dp[i] = max(dp1[i],dp3[i]);FOR(i,1,N+1)    printf("%d\n",dp[i]);}return 0;
}


转载于:https://www.cnblogs.com/hqwhqwhq/p/4555877.html

http://www.jmfq.cn/news/4866895.html

相关文章:

  • 做啤酒纸箱包装的网站/网上引流推广怎么做
  • 浙江网站建设情况/cctv 13新闻频道
  • 帝国+只做网站地图/百度排名规则
  • 网站开发支付超时如何解决/项目网
  • 网站建设要学哪些方面/网络小说排行榜
  • 自己做的网站如何让百度搜索/企业如何建立网站
  • 做教程网站如何查用户搜索/seo查询源码
  • 网站seo怎么做/百度认证营销推广师
  • 设计家装修网站/优化方案模板
  • 怎么知道一个网站是哪家公司做的/网站seo技术教程
  • 免费自己做网站/推广方式有哪几种
  • 网站绑定微信公众号/网站平台如何推广
  • b2b商城网站开发/网络营销的手段包括
  • 中国建设论坛网站大全/长沙网站seo
  • 网站建设供应商税点/军事新闻今日最新消息
  • 做图片的网站都有哪些/市场营销推广方案
  • 网站从建设到运行要多少钱/石家庄seo管理
  • 做墙绘一般在哪个网站/友情链接购买网站
  • 委托网站开发所有权归属/销售管理怎么带团队
  • 网站空间的管理站点/营销推广渠道
  • 产品做网站不花钱/2020最近的新闻大事10条
  • 网站的域名都有哪些/网站seo方案模板
  • 昆明婚恋网站价格/北京环球影城每日客流怎么看
  • php网站服务器怎么来/百度手机助手app下载安装
  • 学校建设网站的意义/潍坊网站建设seo
  • 国际学校网站建设/微信推广文案
  • 西安高端网站建设哪家好/优化大师兑换码
  • 网站公安备案公告/域名查询网址
  • 福田做棋牌网站建设哪家好/google搜索引擎下载
  • 手机版 网站建设/新冠咳嗽怎么办