1. 程式人生 > 其它 >canvas 2d 實現分享海報 (2d的寫法, 圖片被蓋住,圖片輸出模糊等問題)

canvas 2d 實現分享海報 (2d的寫法, 圖片被蓋住,圖片輸出模糊等問題)

一個國家由n個城市組成,這n個城市由n−1條雙向道路連線,呈一個樹形結構。

每個城市都設有加油站,在第i個城市可以購買wi升汽油。

汽車在道路上行駛,毫無疑問也會消耗汽油,每條道路的具體耗油量也會給出。

現在,需要制定一條汽車的行進路線,從任意城市s出發,經過一條簡單路徑,到達任意城市e結束。

注意,行進路線也可以只包含一個城市(也就是哪都沒去)。

汽車初始時油箱是空的,但是可以在路線中經過的每個城市購買汽油,包括開始城市和最終城市。

如果在一條行進路線中,汽車沿一條道路從某一城市開往另一城市時,現有油量小於該條道路所需油量,那麼就說明這條行進路線行不通。

請問,在保證行進路線合理的情況下,汽車在抵達最終城市後,可以剩餘的最大油量是多少?

再次提醒,汽車在最終城市也可以加油。

輸入格式

第一行包含整數n。

第二行包含n個整數w1,w2,,wn

接下來n1行,每行包含三個整數u,v,c,表示城市u和城市v之間存在一條雙向道路,耗油量為c。

輸出格式

一個整數,表示可能的最大剩餘油量。

資料範圍

前三個測試點滿足,1n5
所有測試點滿足,1n3×10^50wi10^91u,vn1c10^9uv

輸入樣例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; }