3107 Godfather(樹形dp,找樹的重心)
阿新 • • 發佈:2019-01-31
題目:就是找樹的重心,可能存在多個,按編號從小到大輸出。一個水題,但是好幾個罰時....不能用vector存邊,會TLE.
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn=5e4+100; struct node { int v; int next; }edge[2*maxn]; int first[maxn],tot; void addedge(int u,int v) { edge[tot].v=v; edge[tot].next=first[u]; first[u]=tot++; } int hvy,n,m,siz[maxn],ma[maxn]; int S; //樹的大小 int num;//重心的數量 void dfs_hvy(int u,int fa)//找重心 { siz[u]=1; ma[u]=0; for(int i=first[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(v==fa) continue; dfs_hvy(v,u); siz[u]+=siz[v]; ma[u]=max(ma[u],siz[v]); } ma[u]=max(ma[u],S-siz[u]); if(!hvy||ma[u]<ma[hvy])// 找重心,以重心為根的樹的最大子樹最小 { hvy=u; num=1; } else if(hvy&&ma[u]==ma[hvy]) num++; } int main() { while(~scanf("%d",&n)) { tot=0; for(int i=1;i<=n;i++) first[i]=-1; for(int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); addedge(x,y); addedge(y,x); } S=n;hvy=0; dfs_hvy(1,-1);//找重心 int k=0; for(int i=1;i<=n;i++) if(ma[i]==ma[hvy]) { k++; if(k<num) printf("%d ",i); else printf("%d\n",i); } } return 0; }