#include <stdio.h>
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;
const int max_data = 2e5;
const long long oo = 1e15;
vector<int> neighbour[max_data];
vector<int> weight[max_data];
long long S[max_data][4];
long long maximum(long long a, long long b, long long c, long long d, long long e)
{
//printf("maximum: %lld %lld %lld %lld %lld\n", a, b, c, d, e);
long long max = a;
if (b > max) max = b;
if (c > max) max = c;
if (d > max) max = d;
if (e > max) max = e;
return max;
}
void bfs(int vertex, int parent = -1)
{
int index = 0;
static long long wynik[2][max_data][2];
int el = neighbour[vertex].size()+4;
for (int i = 0; i < neighbour[vertex].size(); i++)
if (neighbour[vertex][i] != parent)
bfs(neighbour[vertex][i], vertex);
for (int i = 0; i < el; i++)
wynik[0][i][0] = wynik[1][i][0] = wynik[0][i][1] = wynik[1][i][1] = -oo;
wynik[0][el/2][index] = 0;
for (int i = 0; i < neighbour[vertex].size(); i++)
{
int n = neighbour[vertex][i];
int w = weight[vertex][i];
if (n != parent)
{
index = 1-index;
for (int par = 0; par < 2; par++)
{
for (int j = 1; j < el-1; j++)
{
wynik[par][j][index] = maximum(S[n][0] + wynik[par] [j] [1-index],
S[n][0] + w + wynik[par] [j-1][1-index],
S[n][1] + w + wynik[1-par] [j] [1-index],
S[n][2] + w + wynik[par] [j+1][1-index],
S[n][3] + w + wynik[par] [j] [1-index]);
//printf("wynik[%d][%d][%d] = %lld\n", par, j, index, wynik[par][j][index]);
}
}
}
}
S[vertex][0] = wynik[0] [el/2] [index];
S[vertex][1] = wynik[0][el/2+1][index];
S[vertex][2] = wynik[1] [el/2] [index];
S[vertex][3] = wynik[0][el/2-1][index];
/*printf("el: %d\n", el);
printf("%d: ", vertex+1);
for (int i = 0; i < 4; i++)
printf("%lld ", S[vertex][i]);
printf("\n\n");*/
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i < n; i++)
{
int u, v, z;
scanf("%d%d%d", &u, &v, &z);
u--;
v--;
neighbour[u].push_back(v);
neighbour[v].push_back(u);
weight[u].push_back(z);
weight[v].push_back(z);
}
bfs(0, -1);
printf("%lld\n", S[0][0]);
return 0;
}
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 | #include <stdio.h> #include <vector> #include <algorithm> #include <limits> using namespace std; const int max_data = 2e5; const long long oo = 1e15; vector<int> neighbour[max_data]; vector<int> weight[max_data]; long long S[max_data][4]; long long maximum(long long a, long long b, long long c, long long d, long long e) { //printf("maximum: %lld %lld %lld %lld %lld\n", a, b, c, d, e); long long max = a; if (b > max) max = b; if (c > max) max = c; if (d > max) max = d; if (e > max) max = e; return max; } void bfs(int vertex, int parent = -1) { int index = 0; static long long wynik[2][max_data][2]; int el = neighbour[vertex].size()+4; for (int i = 0; i < neighbour[vertex].size(); i++) if (neighbour[vertex][i] != parent) bfs(neighbour[vertex][i], vertex); for (int i = 0; i < el; i++) wynik[0][i][0] = wynik[1][i][0] = wynik[0][i][1] = wynik[1][i][1] = -oo; wynik[0][el/2][index] = 0; for (int i = 0; i < neighbour[vertex].size(); i++) { int n = neighbour[vertex][i]; int w = weight[vertex][i]; if (n != parent) { index = 1-index; for (int par = 0; par < 2; par++) { for (int j = 1; j < el-1; j++) { wynik[par][j][index] = maximum(S[n][0] + wynik[par] [j] [1-index], S[n][0] + w + wynik[par] [j-1][1-index], S[n][1] + w + wynik[1-par] [j] [1-index], S[n][2] + w + wynik[par] [j+1][1-index], S[n][3] + w + wynik[par] [j] [1-index]); //printf("wynik[%d][%d][%d] = %lld\n", par, j, index, wynik[par][j][index]); } } } } S[vertex][0] = wynik[0] [el/2] [index]; S[vertex][1] = wynik[0][el/2+1][index]; S[vertex][2] = wynik[1] [el/2] [index]; S[vertex][3] = wynik[0][el/2-1][index]; /*printf("el: %d\n", el); printf("%d: ", vertex+1); for (int i = 0; i < 4; i++) printf("%lld ", S[vertex][i]); printf("\n\n");*/ } int main() { int n; scanf("%d", &n); for (int i = 1; i < n; i++) { int u, v, z; scanf("%d%d%d", &u, &v, &z); u--; v--; neighbour[u].push_back(v); neighbour[v].push_back(u); weight[u].push_back(z); weight[v].push_back(z); } bfs(0, -1); printf("%lld\n", S[0][0]); return 0; } |
English