hdu-6201 transaction transaction transaction
来源:互联网 发布:c语言学徒招聘 编辑:程序博客网 时间:2024/06/16 23:38
题意:有一颗N个节点的树,点到点之间有唯一的路径,路径有边权,节点有点权。问:在这颗书上任选两点,使的(点权2 - 点权1) - 路径距离 的最大值。
思路:由于是一棵树,所以我们只要求出从其他节点到该节点的 点权 + 路径 的最小值,再用这个点权减去最小值 得到答案,再维护一下这个答案最大值即可。
我们可以任选一个节点作为根节点,然后深搜一遍,递归的从叶子到根维护从 叶子 到 当前节点的 点权 + 路径 的最小值。这个步骤完成之后,我们初步得到了每一个根节点的 每一颗子树传递上来的最小值, 然后我们再做一次广搜,然后对于每一个节点,他的最小值不仅仅从下传递上来的,还有从上传递下来的,或者是从其他兄弟子树传递过来的,而广搜之后,我们就可以将传递到根节点的最小值(可能是根节点另外子树的的最小值)再往下传,更新最小值,同时维护一下答案就好了。
#include <stdio.h>#include <iostream>#include <string.h>#include <string.h>#include <algorithm>#include <queue>#define siz 100005#include <vector>#define LL long longusing namespace std;const int MAXN = 1e18;int n;int gp[siz];LL ans;struct node{ int ad; LL value;};vector<node>vec[siz];void Init(){ for(int i=0; i<siz; i++) { vec[i].clear(); }}LL fp[siz],bp[siz];bool vis[siz];void dfs(int now,int fa){ int len = vec[now].size(); //node u; LL num = gp[now]; fp[now] = num; //Min = num; for(int i=0; i<len; i++) { int u = vec[now][i].ad; int w = vec[now][i].value; if(u == fa) continue; dfs(u,now); // cout<<now<<" "<<u<<" "<<num<<" "<<w<<" "<<fp[u]<<endl; fp[now] = min(w + fp[u],fp[now]); }}void bfs(){ node u,v; u.ad = 3; u.value = gp[3]; //bp[1] = gp[1]; queue<node>que; while(!que.empty()) que.pop(); que.push(u); while(!que.empty()) { u = que.front(); que.pop(); ans=max(ans,gp[u.ad]-fp[u.ad]); int len = vec[u.ad].size(); vis[u.ad] = true; // cout<<u.ad<<" "<<len<<endl; for(int i = 0; i<len; i++) { int dx = vec[u.ad][i].ad; int dy = vec[u.ad][i].value; if(!vis[dx]) { fp[dx]=min(fp[dx],dy+fp[u.ad]); v.ad = dx; v.value = 0; que.push(v); } } }}void solve(){ dfs(3,-1); /*for(int i=1;i<=n;i++){ cout<<fp[i]<<" "; } cout<<endl;*/ memset(vis,false,sizeof(vis)); ans = 0; bfs(); printf("%lld\n",ans);}int main(){ int T; scanf("%d",&T); while(T--) { Init(); scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&gp[i]); } int x,y,va; node u; for(int i=1; i<n; i++) { scanf("%d%d%d",&x,&y,&va); u.ad = y; u.value = va; vec[x].push_back(u); u.ad = x; vec[y].push_back(u); } solve(); } return 0;}
阅读全文
0 0
- hdu 6201transaction transaction transaction
- HDU 6201 transaction transaction transaction
- hdu 6201 transaction transaction transaction
- HDU 6201 transaction transaction transaction
- hdu-6201 transaction transaction transaction
- hdu 6201 transaction transaction transaction
- transaction transaction transaction HDU
- transaction transaction transaction HDU
- Hdu 6201 transaction transaction transaction 树型DP
- HDU 6201 transaction transaction transaction [网络流]
- HDU-6201 transaction transaction transaction(树形dp)
- Hdu 6201 transaction transaction transaction【最长路】
- HDU 6201 transaction transaction transaction(dp)
- 【HDU 6201】transaction transaction transaction 【费用流】
- hdu 6201 transaction transaction transaction tree dp
- HDU 6201 transaction transaction transaction dp
- HDU 6201 transaction transaction transaction(最短路)
- hdu 6201 transaction transaction transaction 树形dp
- DataTable添加列和行的三种方法
- table tr th td 去除默认的边距,间距方法
- nodejs基础: 如何升级Noejs版本
- S3FD: Single Shot Scale-invariant Face Detector
- opencv学习笔记之seq
- hdu-6201 transaction transaction transaction
- Java8 新特性
- destoon短信接口更换成和其他运营商通道并存
- JS中日期转换
- JCTools
- Python如何从相对路径下import
- 聊天机器人5步重塑酒店业
- ArcEingine属性表读取并加载到GridView
- 【Python】Matplotlib画图(七)——线的颜色、点的形状