1. 程式人生 > >HDU6201 | 2017 ACM-ICPC 亞洲區(瀋陽賽區)網路賽-H transaction transaction transaction

HDU6201 | 2017 ACM-ICPC 亞洲區(瀋陽賽區)網路賽-H transaction transaction transaction

題意:一個n個點n-1條邊的無向圖,每個點每條邊都有權值,求一條路徑W終點-W路徑-W起點的最大值;
思路:dp,dp[i]表示以i為終點的路徑的最大值,若x於y相連,那麼有dp[x]=max(dp[x],dp[x]-Wx-Wxy+Wy);

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<set> #include<vector> #include<cmath> #define lmid l,m,rt<<1 #define rmid m+1,r,rt<<1|1 #define LL long long #define rl r-l+1 using namespace std; struct node { int u,v,w; }s[200005]; int cnt; void add(int u,int v,int w) { s[cnt].u=u; s[cnt].v=v; s[cnt].w=w; cnt++; } int
dp[100005]; int res[100005]; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&res[i]); cnt=0; for(int i=1;i<=n-1;i++) { int
a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } memset(dp,0,sizeof(dp)); for(int i=0;i<cnt;i++) { node e=s[i]; dp[e.v]=max(dp[e.v],dp[e.u]-res[e.u]-e.w+res[e.v]); } int ans=0; for(int i=1;i<=n;i++) if(dp[i]>ans) ans=dp[i]; cout<<ans<<endl; } }