SGU 134 数组模拟树状dp
来源:互联网 发布:朝鲜 氢弹 知乎 编辑:程序博客网 时间:2024/06/06 05:18
往往在dfs层数增加的时候都会面临着爆栈的危险,怎样避免它??栈模拟?不对~栈模拟编程复杂度太高~
用数组模拟!数组模拟不仅快,而且代码量很短~适合搞树状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;}
- SGU 134 数组模拟树状dp
- sgu 180(树状数组)
- SGU 180. Inversions 离散 + 树状数组
- SGU 311. Ice-cream Tycoon 树状数组
- SGU 180 Inversions (树状数组+离散化)
- SGU 134 树形DP
- hdu5125 dp+树状数组
- hdu4521 dp+树状数组
- HDU5542(dp+树状数组)
- HDU5542(dp + 树状数组)
- sgu 143 Long Live the Queen 树状DP
- [NOIP模拟] Work (树状数组)
- SGU 134 Centroid(树形dp)
- SGU 134 Centroid 树形DP
- NOIP模拟题 2016.9.3 [数论] [逆序对] [树状数组] [树形dp]
- SGU 180-Inversions(树状数组离散化求逆序对数)
- SGU 180 Inversions(树状数组求逆序对)
- SGU 180 Inversions <一维树状数组区间查询>
- android发送get请求
- POJ 1101 The Game (bfs)
- BIO VS NIO
- android发送post请求
- oracle 添加列到指定位置
- SGU 134 数组模拟树状dp
- 文件小结
- C++之路 坚持
- DBGridEH中使用checkBox的副作用
- [Java]获取某年某月有多少天
- Linux下利用rsync实现多服务器文件同步
- 关于ubuntu sudo及root登录等相关
- flex 1046: 找不到类型,或者它不是编译时常数: xxx
- iOS自定义Status Bar