poj 1655
题意:一棵树,定义每个节点的balance值:去掉这点节点后的森林里所有树的最大节点数。求出最小的balance值和其所对应的节点编号。
#include<iostream> #include<fstream> using namespace std; struct e{ int data; e *next; }; e edge[20001]; int v[20001]; int a[20001]; int b[20001]; int n; void solve(int s){ int i,j=0,k=0; e *p=edge[s].next; v[s]=1; while(p){ if(v[p->data]==0) { solve(p->data); j+=b[p->data]; k=max(k,b[p->data]); } p=p->next; } b[s]=j+1; k=max(k,n-b[s]); a[s]=k; } void read(){ // ifstream cin("in.txt"); int i,j,k,s,t; int cas; cin>>cas; while(cas--) { cin>>n; for(i=1;i<=n;i++) edge[i].next=0; memset(v,0,sizeof(v)); for(i=1;i<n;i++) { cin>>s>>t; e *p=new e; p->data=t; p->next=edge[s].next; edge[s].next=p; e *q=new e; q->data=s; q->next=edge[t].next; edge[t].next=q; } solve(1); int j=n+1; for(i=1;i<=n;i++) if(j>a[i]) { j=a[i]; k=i; } cout<<k<<' '<<j<<endl; } } int main(){ read(); return 0; }