hdu 4714 树+DFS
生活随笔
收集整理的這篇文章主要介紹了
hdu 4714 树+DFS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4714
本來想直接求樹的直徑,再得出答案,后來發現是錯的。
思路:任選一個點進行DFS,對于一棵以點u為根節點的子樹來說,如果它的分支數大于1,那么我們把這顆子樹從整棵樹上剪下來(優先減去),同時把這顆子樹的分支留下兩個,其它多余的也剪掉,然后把剪下來的這些部分連接到根節點那里,從而形成一條直鏈,總代價就是我們減的次數+把剪下來的部分連接到根節點+把最后的直鏈連成環。在這里剪的次數=把剪下來的部分連接到根節點的次數,把最后的直鏈連成環只需要一步。
參考博客:https://blog.csdn.net/cc_again/article/details/11407157
代碼:
#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<map> #include<stack> #include<cmath> #include<vector> #include<set> #include<cstdio> #include<string> #include<deque> using namespace std; typedef long long LL; #define eps 1e-8 #define INF 0x3f3f3f3f #define maxn 1000005 int n,m,k,t,cnt; int ans; struct node{int v,next; }edge[maxn*2]; int head[maxn]; void add(int u,int v){edge[++cnt].v=v;edge[cnt].next=head[u];head[u]=cnt; } int DFS(int u,int pre){int num=0;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].v;if(v==pre)continue;num+=DFS(v,u);}if(num>1){//如果以點u為根節點的子樹的分支數大于1 if(u==1)ans+=num-2;elseans+=num-1;return 0;//這顆子樹剪斷了,所以返回0 }return 1;//分支數只有一個 } int main() {scanf("%d",&t);while(t--){scanf("%d",&n);int u,v;cnt=0;memset(head,-1,sizeof(head));for(int i=1;i<n;i++){scanf("%d%d",&u,&v);add(u,v);add(v,u);}ans=0;DFS(1,-1);printf("%d\n",ans*2+1);}return 0; }?
轉載于:https://www.cnblogs.com/6262369sss/p/10034755.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的hdu 4714 树+DFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [51CTO]给您介绍Windows10
- 下一篇: 非阻塞算法简介