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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数的直径(两次DFS)

發布時間:2024/4/17 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数的直径(两次DFS) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目傳送門

桃花

題目描述

????桃花一簇開無主,可愛深紅映淺紅。

——《題百葉桃花》

????桃花長在桃樹上,樹的每個節點有一個桃花,調皮的HtBest想摘盡可能多的桃花。HtBest有一個魔法棒,摘到樹上任意一條鏈上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,請求出Htbest最多可以摘到多少個桃花。

輸入描述:

第一行有一個正整數n,表示桃樹的節點個數。
接下來n-1行,第i行兩個正整數a,b

輸出描述:

第一行一個整數,表示HtBest使用一次魔法棒最多可以摘到多少桃花。
輸入 3 1 2 2 3
輸出
3
題意:就是求數的直徑,不過本題求的是頂點數,樹的直徑的一個性質:距某個點最遠的葉子節點一定
是樹的某一條直徑的端點。這樣我們先dfs求一個點的最遠端點,再從這個點dfs一次。也可以百度一下,
大意是反證距離任意點最遠的點都是直徑的端點。
代碼:
#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); }

?

轉載于:https://www.cnblogs.com/zhgyki/p/9535420.html

總結

以上是生活随笔為你收集整理的数的直径(两次DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。