记录编号 488698 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [WC 2018] 通道 最终得分 100
用户昵称 GravatarImone NOI2018Au 是否通过 通过
代码语言 C++ 运行时间 88.824 s
提交时间 2018-02-23 17:03:09 内存使用 6.03 MiB
显示代码纯文本
  1. #include <cstring>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <ctime>
  6. #define ll long long
  7. using namespace std;
  8.  
  9. const int MAXN = 100010;
  10. int N;
  11. vector<int> G[3][MAXN];
  12. vector<ll> D[3][MAXN];
  13.  
  14. inline int myrand(int l, int r) {
  15. r++; //[l, r)
  16. while(r - l > 1) {
  17. int m = (l + r) / 2;
  18. if(rand() & 1) l = m; else r = m;
  19. }
  20. return l;
  21. }
  22.  
  23. int id;
  24. ll dist[MAXN];
  25. void dfs(int u, int f, ll d) {
  26. int i, v;
  27. dist[u] += d;
  28. for(i = 0; i < G[id][u].size(); i++) if((v = G[id][u][i]) != f)
  29. dfs(v, u, d + D[id][u][i]);
  30. }
  31.  
  32. int main() {
  33. freopen("tunnel.in", "rt", stdin);
  34. freopen("tunnel.out", "wt", stdout);
  35.  
  36. clock_t end = clock() + CLOCKS_PER_SEC * 3.60;
  37.  
  38. int i, k, u, v; ll d;
  39. scanf("%d", &N);
  40. for(k = 0; k < 3; k++) for(i = 1; i < N; i++) {
  41. scanf("%d%d%lld", &u, &v, &d);
  42. G[k][u].push_back(v), D[k][u].push_back(d);
  43. G[k][v].push_back(u), D[k][v].push_back(d);
  44. }
  45.  
  46. ll Ans = 0;
  47. while(clock() < end) {
  48. u = myrand(1, N); //random start
  49. for(k = 1; k <= 7; k++) { //iterate
  50. memset(dist, 0, sizeof(ll) * (N + 1));
  51. for(id = 0; id < 3; id++) dfs(u, 0, 0);
  52.  
  53. ll maxd = 0; int maxp = u;
  54. for(i = 1; i <= N; i++) if(dist[i] > maxd) maxd = dist[i], maxp = i;
  55. u = maxp;
  56. Ans = max(Ans, maxd);
  57. }
  58. }
  59. printf("%lld", Ans);
  60. }