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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include<cstdio> #include<cstring> #include<queue> using namespace std; #define re register const int MAXn = 1e5; const int MAXm = MAXn; const int INF = 0x3f3f3f3f;
template <class T> inline void read(T &a) { register char c;while (c = getchar(), c < '0' || c > '9');register T x(c - '0');while (c = getchar(), c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);}a = x; }
int head[MAXn + 10], cntnex, nex[MAXm * 2 + 10], to[MAXm * 2 + 10]; void Insert(int u, int v) { nex[++cntnex] = head[u]; head[u] = cntnex; to[cntnex] = v; }
double k; int n, a[MAXn + 10], deg[MAXn + 10];
queue<int> q; bool vis[MAXn + 10]; int cntring, ring[MAXn + 10]; void EvaRing() { for (re int i = 1; i <= n; ++i) { if (deg[i] == 1) { q.push(i); } } int cur; while (!q.empty()) { cur = q.front(); q.pop(); vis[cur] = 1; for (re int i = head[cur]; i; i = nex[i]) { if (!vis[to[i]]) { --deg[to[i]]; if (deg[to[i]] == 1) { q.push(to[i]); } } } } for (re int i = 1; i <= n; ++i) { if (deg[i] == 2) { vis[i] = 1; ring[++cntring] = i; break; } } bool ok = 1; while (ok) { ok = 0; for (re int i = head[ring[cntring]]; i; i = nex[i]) { if (vis[to[i]] || deg[to[i]] == 1) continue; vis[to[i]] = 1; ring[++cntring] = to[i]; ok = 1; break; } } }
int d[MAXn + 10][2]; void dp(int cur) { vis[cur] = 1; for (re int i = head[cur]; i; i = nex[i]) { if (vis[to[i]] || deg[to[i]] == 2) continue; dp(to[i]); d[cur][0] += max(d[to[i]][1], d[to[i]][0]); d[cur][1] += d[to[i]][0]; } d[cur][1] += a[cur]; } void Dp() { memset(vis, 0, sizeof(vis)); for (re int i = 1; i <= cntring; ++i) { dp(ring[i]); } }
int f[MAXn + 10][2][2]; int Dp2() { f[1][0][0] = d[ring[1]][0]; f[1][1][1] = d[ring[1]][1]; f[1][0][1] = f[1][1][0] = -INF; for (re int i = 2; i <= cntring; ++i) { f[i][0][0] = max(f[i - 1][0][0], f[i - 1][0][1]) + d[ring[i]][0]; f[i][0][1] = f[i - 1][0][0] + d[ring[i]][1]; f[i][1][0] = max(f[i - 1][1][0], f[i - 1][1][1]) + d[ring[i]][0]; f[i][1][1] = f[i - 1][1][0] + d[ring[i]][1]; } return max(max(f[cntring][0][0], f[cntring][0][1]), f[cntring][1][0]); }
int main() { read(n); for (re int i = 1; i <= n; ++i) { read(a[i]); } for (re int i = 1, u, v; i <= n; ++i) { read(u), read(v); ++u; ++v; ++deg[u]; ++deg[v]; Insert(u, v); Insert(v, u); } scanf("%lf", &k); EvaRing(); Dp(); printf("%.1lf\n", (double)Dp2() * k); }
|