1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10, M = 1e6 + 10; int hs[N], he[N], ne[M], to[M], idx; int price[N]; bool st[N]; int dmin[N], dmax[N]; int n, m;
void add(int h[], int x, int y) { to[idx] = y, ne[idx] = h[x], h[x] = idx++; } void spfa(int h[], int s, int d[], int flag) { queue<int> q; memset(st, 0, sizeof st); if(flag == 0) memset(d, 0x3f, sizeof dmin); d[s] = price[s]; q.push(s); st[s] = true; while(q.size()) { int t = q.front(); q.pop(); st[t] = false; for(int i = h[t]; ~i; i = ne[i]) { int j = to[i]; if(flag == 0 && d[j] > min(d[t], price[j]) || flag == 1 && d[j] < max(d[t], price[j])) { if(flag == 0) d[j] = min(d[t], price[j]); else d[j] = max(d[t], price[j]); if(!st[j]) { st[j] = true; q.push(j); } } } } } int main() { std::ios::sync_with_stdio(0); std::cin.tie(0); memset(he, -1, sizeof he); memset(hs, -1, sizeof hs); cin >> n >> m; for(int i = 1; i <= n; i++) cin >> price[i]; while(m--) { int x, y, z; cin >> x >> y >> z; add(hs, x, y); add(he, y, x); if(z == 2) { add(hs, y, x); add(he, x, y); } } spfa(hs, 1, dmin, 0); spfa(he, n, dmax, 1); int res = 0; for(int i = 1; i <= n; i++) res = max(res, dmax[i] - dmin[i]); cout << res; return 0; }
|