数的直径(两次DFS)
生活随笔
收集整理的這篇文章主要介紹了
数的直径(两次DFS)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目傳送門
桃花
題目描述
????桃花一簇開(kāi)無(wú)主,可愛(ài)深紅映淺紅。
——《題百葉桃花》????桃花長(zhǎng)在桃樹上,樹的每個(gè)節(jié)點(diǎn)有一個(gè)桃花,調(diào)皮的HtBest想摘盡可能多的桃花。HtBest有一個(gè)魔法棒,摘到樹上任意一條鏈上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,請(qǐng)求出Htbest最多可以摘到多少個(gè)桃花。
輸入描述:
第一行有一個(gè)正整數(shù)n,表示桃樹的節(jié)點(diǎn)個(gè)數(shù)。接下來(lái)n-1行,第i行兩個(gè)正整數(shù)a,b
輸出描述:
第一行一個(gè)整數(shù),表示HtBest使用一次魔法棒最多可以摘到多少桃花。輸入 3 1 2 2 3
輸出
3
題意:就是求數(shù)的直徑,不過(guò)本題求的是頂點(diǎn)數(shù),樹的直徑的一個(gè)性質(zhì):距某個(gè)點(diǎn)最遠(yuǎn)的葉子節(jié)點(diǎn)一定
是樹的某一條直徑的端點(diǎn)。這樣我們先dfs求一個(gè)點(diǎn)的最遠(yuǎn)端點(diǎn),再?gòu)倪@個(gè)點(diǎn)dfs一次。也可以百度一下,
大意是反證距離任意點(diǎn)最遠(yuǎn)的點(diǎn)都是直徑的端點(diǎn)。
代碼: #include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<queue> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long long ll; typedef pair<int,int> PII; #define mod 1000000007 #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second //head #define N 1000005 vector<int>V[N]; int dis[N]; int xp=-1; int ans=0; inline int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; } inline void write(int x) {if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0'); } void dfs(int a) {if(xp<dis[a]){xp=dis[a];ans=a;}for(int v: V[a]){if(dis[v]==-1){dis[v]=dis[a]+1;dfs(v);}} } int main() {//ios_base::sync_with_stdio(0); cin.tie(0);int n;int a,b;n=read();for(int i=0;i<n-1;i++){a=read();b=read();V[a].pb(b);V[b].pb(a);}for(int i=1;i<=n;i++) dis[i]=-1;dis[1]=0;dfs(1);memset(dis,-1,sizeof(dis));dis[ans]=0;xp=-1;dfs(ans);write(xp+1); }
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhgyki/p/9535420.html
總結(jié)
以上是生活随笔為你收集整理的数的直径(两次DFS)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: spring注解方式注入bean
- 下一篇: 大二暑假周进度总结07