SGU 134 数组模拟树状dp
2012-04-02 16:35
369 查看
往往在dfs层数增加的时候都会面临着爆栈的危险,怎样避免它??栈模拟?不对~栈模拟编程复杂度太高~
用数组模拟!数组模拟不仅快,而且代码量很短~适合搞树状dp~细节多,初学者慎用~
用数组模拟!数组模拟不仅快,而且代码量很短~适合搞树状dp~细节多,初学者慎用~
#include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<map> #include<set> #include<cmath> #include<cassert> #include<cstring> #include<iomanip> using namespace std; #ifdef _WIN32 #define i64 __int64 #define out64 "%I64d\n" #define in64 "%I64d" #else #define i64 long long #define out64 "%lld\n" #define in64 "%lld" #endif #define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++) #define FF(i,a) for( int i = 0 ; i < (a) ; i ++) #define FFD(i,a) for( int i = (a)-1 ; i >= 0 ; i --) #define S64(a) scanf(in64,&a) #define SS(a) scanf("%d",&a) #define LL(a) ((a)<<1) #define RR(a) (((a)<<1)+1) #define SZ(a) ((int)a.size()) #define PP(n,m,a) puts("---");FF(i,n){FF(j,m)cout << a[i][j] << ' ';puts("");} #define pb push_back #define CL(Q) while(!Q.empty())Q.pop() #define MM(name,what) memset(name,what,sizeof(name)) #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout) const int inf = 0x3f3f3f3f; const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL; const double oo = 10e9; const double eps = 10e-10; const double pi = acos(-1.0); const int maxn = 16001; vector<int>g[maxn]; vector<int>v; int dp[maxn]; int dpmax[maxn]; int f[maxn]; int dfn[maxn]; int dfv[maxn]; int df,n,ans; void dfs(int now=1) { FF(i,g[now].size()) if(g[now][i] != f[now]) { f[g[now][i]] = now; dfs(g[now][i]); } dfv[df] = now; dfn[now] = df; df++; return ; } void dps() { FOR(i,1,df-2) // 这个地方小心,-1的话就是wa,因为根节点没有父节点 { dp[dfv[i]]++; dpmax[dfv[i]]=max(dpmax[dfv[i]],n-dp[dfv[i]]); dpmax[f[dfv[i]]]=max(dpmax[f[dfv[i]]],dp[dfv[i]]); dp[f[dfv[i]]]+=dp[dfv[i]]; } return ; } void start() { df = 1; MM(dp,0); MM(dpmax,0); MM(f,0); dfs(); dps(); ans=inf; for(int i=1;i<=n;i++) { ans = min(ans,dpmax[i]); } for(int i=1;i<=n;i++) { if(dpmax[i] == ans) { v.pb(i); } } sort(v.begin(),v.end()); return ; } int main() { cin>>n; int now,to; FOR(i,1,n-1) { cin>>now>>to; g[now].pb(to); g[to].pb(now); } start(); cout<<ans<<" "<<v.size()<<endl; FF(i,v.size()-1) { cout<<v[i]<<" "; } cout<<v.back()<<endl; return 0; }
相关文章推荐
- 树状数组优化DP 【模拟赛】删区间
- SGU 134 Centroid(树形DP)
- zoj 3349 简单DP 线段树或树状数组优化
- Kattis peaktram (树状数组 DP)
- SGU 134.Centroid( 树形dp )
- [bzoj1264][AHOI2006]基因匹配Match 树状数组优化dp
- hdu 5489 Removed Interval 2015合肥网络赛 树状数组 dp 离散化/dp
- CodeForces–830B--模拟,树状数组||线段树
- dp 树状数组 逆序元组
- bzoj 2090 [Poi2010]Monotonicity 2 树状数组 dp 贪心
- SGU 180 Inversions(树状数组求逆序对)
- UVA11775 Unique Story dp+二维树状数组优化
- DP+树状数组——FZU 2236 第十四个目标
- [DP] [2D2D优化] [二维树状数组] [SCOI2014] 方伯伯的玉米田
- SGU 134 Centroid [树形DP]
- BZOJ3594 [Scoi2014]方伯伯的玉米田 【树状数组优化dp】
- sgu 180. Inversions (树状数组+离散化,第一道需要改模板的题目,好题)
- 树状数组模拟3个元素的排序 Codeforces 12D Ball
- [占坑] 图像处理中计算积分图使用类似dp的方法而不用树状数组的原因
- zzuli oj 多校训练(三)【树链剖分--树状数组---STL----二分图----二分----DP】