canvas 2d 實現分享海報 (2d的寫法, 圖片被蓋住,圖片輸出模糊等問題)
阿新 • • 發佈:2021-10-14
一個國家由n個城市組成,這n個城市由n−1條雙向道路連線,呈一個樹形結構。
每個城市都設有加油站,在第i個城市可以購買wi升汽油。
汽車在道路上行駛,毫無疑問也會消耗汽油,每條道路的具體耗油量也會給出。
現在,需要制定一條汽車的行進路線,從任意城市s出發,經過一條簡單路徑,到達任意城市e結束。
注意,行進路線也可以只包含一個城市(也就是哪都沒去)。
汽車初始時油箱是空的,但是可以在路線中經過的每個城市購買汽油,包括開始城市和最終城市。
如果在一條行進路線中,汽車沿一條道路從某一城市開往另一城市時,現有油量小於該條道路所需油量,那麼就說明這條行進路線行不通。
請問,在保證行進路線合理的情況下,汽車在抵達最終城市後,可以剩餘的最大油量是多少?
再次提醒,汽車在最終城市也可以加油。
輸入格式
第一行包含整數n。
第二行包含n個整數w1,w2,…,wn。
接下來n−1行,每行包含三個整數u,v,c,表示城市u和城市v之間存在一條雙向道路,耗油量為c。
輸出格式
一個整數,表示可能的最大剩餘油量。
資料範圍
前三個測試點滿足,1≤n≤5。
所有測試點滿足,1≤n≤3×10^5,0≤wi≤10^9,1≤u,v≤n,1≤c≤10^9,u≠v。
輸入樣例1:
3
1 3 3
1 2 2
1 3 2
輸出樣例1:
3
輸入樣例2:
5
6 3 2 5 0
1 2 10
2 3 3
2 4 1
1 5 1
輸出樣例2:
7
遍歷路徑的最高點,從上到下遍歷,攜帶兩個引數,當前節點和父節點,以免重複搜尋,並且把ans定義為全域性變數,這樣在遍歷時即可求出答案,此樹的節點是正權值,邊是負權值
#include <iostream> #include <cstring> #include <algorithm> #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 300010,M=2*N; int h[N], e[M], ne[M], idx,w[M]; int v[N]; //LL dp[N]; LL ans=0; void add(int a, int b, int c) // 新增一條邊a->b,邊權為c { e[idx]= b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ; } LL dfs(int u,int father){ LL d1=0,d2=0; for(int i=h[u];~i;i=ne[i]){ int j=e[i]; if(j==father)continue; LL res=dfs(j,u); if(res<w[i])continue; res-=w[i]; if(res>=d1)d2=d1,d1=res; else if(res>d2)d2=res; } ans=max(ans,d1+d2+v[u]); return d1+v[u]; } int main() { int n; scanf("%d", &n); memset(h, -1, sizeof h); for (int i = 1; i <= n; i ++ ) scanf("%d", &v[i]); for (int k = 0; k < n-1; k ++ ){ int a,b,c; scanf("%d%d%d", &a,&b,&c); add(a, b, c); add(b, a, c); } dfs(1,-1); cout<<ans; return 0; }