日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ1509: [NOI2003]逃学的小孩(树的直径)

發(fā)布時(shí)間:2023/12/6 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ1509: [NOI2003]逃学的小孩(树的直径) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Time Limit:?5 Sec??Memory Limit:?64 MB
Submit:?1126??Solved:?567
[Submit][Status][Discuss]

Description

Input

第一行是兩個(gè)整數(shù)N(3 ? N ? 200000)和M,分別表示居住點(diǎn)總數(shù)和街道總數(shù)。以下M行,每行給出一條街道的信息。第i+1行包含整數(shù)Ui、Vi、Ti(1?Ui, Vi ? N,1 ? Ti ? 1000000000),表示街道i連接居住點(diǎn)Ui和Vi,并且經(jīng)過(guò)街道i需花費(fèi)Ti分鐘。街道信息不會(huì)重復(fù)給出。

Output

僅包含整數(shù)T,即最壞情況下Chris的父母需要花費(fèi)T分鐘才能找到Chris。

Sample Input

4 3
1 2 1
2 3 1
3 4 1

Sample Output

4

HINT

Source

?

這題比較naive吧。。

不過(guò)我一開(kāi)始以為C是給出的。

很顯然$AB$一定是樹(shù)的直徑。

敲完了才發(fā)現(xiàn)C是不固定的以為自己白寫(xiě)了。

但實(shí)際上只需要求出直徑的端點(diǎn)到每個(gè)點(diǎn)的距離,然后在小的里面取最大就好了

?

#include<cstdio> #include<vector> #include<algorithm> #include<cstring> #include<map> #include<cmath> #include<queue> #define int long long using namespace std; const int INF = 1e9 + 10, MAXN = 1e6 + 10; inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f; } int N, M; struct Edge {int u, v, w, nxt; }E[MAXN]; int head[MAXN], num = 1; inline void AddEdge(int x, int y, int z) {E[num] = (Edge) {x, y, z, head[x]};head[x] = num++; } int dis[MAXN], mx, mxdis; void dfs(int x, int fa) {for(int i = head[x]; i != -1; i = E[i].nxt) {if(E[i].v == fa) continue;dis[E[i].v] = dis[x] + E[i].w;dfs(E[i].v, x);if(dis[E[i].v] > mxdis) mxdis = dis[E[i].v], mx = E[i].v;} } int Node1, Node2, dis1[MAXN], dis2[MAXN]; int GetAns() {memset(dis, 0, sizeof(dis)); dfs(Node1, 0);for(int i = 1; i <= N; i++) dis1[i] = dis[i];memset(dis, 0, sizeof(dis)); dfs(Node2, 0);for(int i = 1; i <= N; i++) dis2[i] = dis[i];int rt = 0;for(int i = 1; i <= N; i++)rt = max(rt, min(dis1[i], dis2[i]));return rt; } main() { #ifdef WIN32freopen("a.in", "r", stdin); #endifmemset(head, -1, sizeof(head));N = read(); M = read();for(int i = 1; i <= M; i++) {int x = read(), y = read(), z = read();AddEdge(x, y, z);AddEdge(y, x, z);}dfs(1, 0); Node1 = mx;memset(dis, 0, sizeof(dis)); mxdis = 0;dfs(mx, 0); Node2 = mx;int ans = dis[mx];printf("%I64d", ans + GetAns()); }

?

總結(jié)

以上是生活随笔為你收集整理的BZOJ1509: [NOI2003]逃学的小孩(树的直径)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。