poj2478
比較簡單的樹形dp;
定義s[i]為節點i的子樹節點數和(包括自身);葉子節點s[j]=1;?
?s[i]=signma(s[k])+1 (k是i的孩子)
則i滿足的條件是?1.s[k]<=n div 2 ?(k為所有孩子節點)
? ? ? ? ? ? ? ? 2.n-s[k]<=n div 2;
由于n比較大,可以考慮用前向星來存儲,這題想明白了還是很簡單的,最后注意滿足條件的節點升序輸出;
1 type link=^node; 2 ? ? ?node=record 3 ? ? ? ?data:integer; 4 ? ? ? ?next:link; 5 ? ? ?end; 6 var c:array[0..10010] of link; 7 ? ? f,a:array[0..10010] of boolean; 8 ? ? s:array[0..10010] of longint; 9 ? ? i,n,x,y:integer; 10 ? ? w:boolean; 11 ? ? r:link; 12 procedure add(x,y:integer); ? ?//前向星 13 ? var p:link; 14 ? begin 15 ? ? new(p); 16 ? ? p^.data:=y; 17 ? ? p^.next:=c[x]; 18 ? ? c[x]:=p; 19 ? end; 20 procedure treedp(x:integer); 21 ? var ch:boolean; 22 ? ? ? i:integer; 23 ? ? ? r:link; 24 ? begin 25 ? ? ch:=true; 26 ? ? s[x]:=1; 27 ? ? f[x]:=true; 28 ? ? r:=c[x]; 29 ? ? while r<>nil do 30 ? ? begin 31 ? ? ? if not f[r^.data] then 32 ? ? ? begin 33 ? ? ? ? f[r^.data]:=true; ? ? ? ? ? ? ? ? ? ?//前向星是圖結構,這里的標記是建立從父節點到子節點的關系 34 ? ? ? ? treedp(r^.data); 35 ? ? ? ? if s[r^.data]>n div 2 then ch:=false; ?? 36 ? ? ? ? inc(s[x],s[r^.data]); 37 ? ? ? end; 38 ? ? ? r:=r^.next; 39 ? ? end; 40 ? ? if (n-s[x])>n div 2 then ch:=false; 41 ? ? if ch then a[x]:=true; 42 ? end; 43 begin 44 ? readln(n); 45 ? for i:=1 to n-1 do 46 ? begin 47 ? ? readln(x,y); 48 ? ? add(x,y); 49 ? ? add(y,x); 50 ? end; 51 ? fillchar(f,sizeof(f),false); 52 ? fillchar(a,sizeof(a),false); 53 ? treedp(1); ? ? ? ? ? ? ? //生成樹任意一個節點都可以作為根節點 54 ? w:=false; 55 ? for i:=1 to n do 56 ? begin 57 ? ? if a[i] then 58 ? ? begin 59 ? ? ? w:=true; 60 ? ? ? writeln(i); 61 ? ? end; 62 ? end; 63 ? if not w then writeln('NONE'); 64 end. View Code?
轉載于:https://www.cnblogs.com/phile/p/4473309.html
總結
- 上一篇: Objective-C中的hasPref
- 下一篇: poj1988(判断一个结点下面有多少个