记录编号 |
488698 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
[WC 2018] 通道 |
最终得分 |
100 |
用户昵称 |
Imone NOI2018Au |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
88.824 s |
提交时间 |
2018-02-23 17:03:09 |
内存使用 |
6.03 MiB |
显示代码纯文本
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <vector>
- #include <ctime>
- #define ll long long
- using namespace std;
-
- const int MAXN = 100010;
- int N;
- vector<int> G[3][MAXN];
- vector<ll> D[3][MAXN];
-
- inline int myrand(int l, int r) {
- r++; //[l, r)
- while(r - l > 1) {
- int m = (l + r) / 2;
- if(rand() & 1) l = m; else r = m;
- }
- return l;
- }
-
- int id;
- ll dist[MAXN];
- void dfs(int u, int f, ll d) {
- int i, v;
- dist[u] += d;
- for(i = 0; i < G[id][u].size(); i++) if((v = G[id][u][i]) != f)
- dfs(v, u, d + D[id][u][i]);
- }
-
- int main() {
- freopen("tunnel.in", "rt", stdin);
- freopen("tunnel.out", "wt", stdout);
-
- clock_t end = clock() + CLOCKS_PER_SEC * 3.60;
-
- int i, k, u, v; ll d;
- scanf("%d", &N);
- for(k = 0; k < 3; k++) for(i = 1; i < N; i++) {
- scanf("%d%d%lld", &u, &v, &d);
- G[k][u].push_back(v), D[k][u].push_back(d);
- G[k][v].push_back(u), D[k][v].push_back(d);
- }
-
- ll Ans = 0;
- while(clock() < end) {
- u = myrand(1, N); //random start
- for(k = 1; k <= 7; k++) { //iterate
- memset(dist, 0, sizeof(ll) * (N + 1));
- for(id = 0; id < 3; id++) dfs(u, 0, 0);
-
- ll maxd = 0; int maxp = u;
- for(i = 1; i <= N; i++) if(dist[i] > maxd) maxd = dist[i], maxp = i;
- u = maxp;
- Ans = max(Ans, maxd);
- }
- }
- printf("%lld", Ans);
- }