poj1655 树的重心 dfs
输入
产量
样本输入
1 7 2 6 1 2 1 4 4 5 3 7 3 1
样本输出
1 2
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #define inf 0x3f3f3f3f using namespace std; const int maxn=2e5+10; vector<int> v[maxn]; int siz[maxn]; int ma=inf,ans=inf; int n; void dfs(int x,int fa){ siz[x]=1; int maxx=0; for(int i=0;i<(int)v[x].size();i++){ int y=v[x][i]; if(y==fa) continue; dfs(y,x); siz[x]+=siz[y]; maxx=max(siz[y],maxx); } maxx=max(maxx,n-siz[x]); if( maxx < ma ||( (maxx==ma) && x<ans )){ //具有最小余额的节点 //如果多个节点具有相等的余额 则输出编号最小的节点。 ma=maxx; ans=x; } } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); ma=inf,ans=inf; for(int i=0;i<=n;i++) v[i].clear(),siz[i]=0; for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } dfs(1,1); //1,1为起点开始搜 printf("%d %d\n",ans,ma); } return 0; }
优质内容筛选与推荐>>