数的直径(两次DFS)
生活随笔
收集整理的這篇文章主要介紹了
数的直径(两次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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring注解方式注入bean
- 下一篇: 大二暑假周进度总结07