\(description:\)
給出一棵樹,求樹上位於最長路徑上的點,即位於與直徑長度相同的路徑上的所有點\(sample\)
\(input:\)
10\(sample\)0 10 2
0 40 6
0 71 3
2 54 8
6 9
\(output:\)
012\(solution:\)3456
89
震驚一本通上居然有這麼好的題,這題求直徑很簡單,但是怎麼求位於直徑上的點?
考慮再dp一遍,求出乙個點到除他所在的子樹的最大距離。
然後列舉所有點看看是不是字樹內的最大距離加上子樹外的最大距離等於直徑長度。
怎麼求子樹外的最大距離呢?
其實只要從上到下,從根到葉子結點轉移。
設當前點為 \(u\) ,他的兒子 \(v\) ,\(f[v]\) 表示 \(v\) 子樹外的最遠距離。
那麼如果這個點吧 \(d1[u]\) 更新了,那麼他就不能從 \(d1[u]\) **得到更新
不然就可以。
**:
#includeusing namespace std;
int n,cnt,max_dis;
const int n=2e5+5;
int d1[n],d2[n],pre[n],nxt[n],ans[n];
int f[n];
bool vis[n];
vector e[n];
inline void dfs1(int u,int fa)
else if(d1[v]+1>d2[u])
d2[u]=d1[v]+1;
} max_dis=max(max_dis,d1[u]+d2[u]);
}inline void dfs2(int u,int fa)
for(int i=0;i<(int)e[u].size();++i)
}int main()
dfs1(0,0);
dfs2(0,0);
for(int i=0;iif(d1[i]+max(d2[i],f[i])==max_dis)
printf("%d\n",i);
return 0;
}
一本通1581旅遊規劃
時間限制 1000 ms 記憶體限制 524288 kb 描述w市的交通規劃出現了重大問題,市 下決心在全市的各大交通路口安排交通疏導員來疏導密集的車流。但由於人員不足,w市市長決定只在最需要安排人員的路口安放人員。具體說來,w市的交通網路十分簡單,它包括n個交叉路口和n 1條街道,任意一條街道連線...
7 9 旅遊規劃
輸入說明 輸入資料的第1行給出4個正整數n m s d,其中n 2 n 500 是城市的個數,順便假設城市的編號為0 n 1 m是高速公路的條數 s是出發地的城市編號 d是目的地的城市編號。隨後的 m行中,每行給出一條高速公路的資訊,分別是 城市1 城市2 高速公路長度 收費額,中間用空格分開,數字...
7 9 旅遊規劃
有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度 以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。輸入說明 輸入資料的第1行給出4個正整數n m s d,其中n 2 n 500 是城市...