SRM 570 div2
250pt 和 500pt都是简单题,500pt暴力就可以。。。
1000pt:
题意:给一棵树,求这棵树中不同子树的个数。
解:f[i]表示以i点为根节点所包含的子数的个数。
f[i] *= (f[j] + 1) 其中i -> j有边相连,+1表示不选以j为根的这棵子树;
dfs;
int mp[60][60]; bool vis[60]; LL ans; class CentaurCompanyDiv2 { public: LL dfs(int u) { int i; vis[u] = true; LL cnt = 1; for(i = 1; i <= 51; ++i) { if(mp[u][i] == 0) continue; if(!vis[i]) { cnt = cnt * (dfs(i) + 1); } } ans += cnt; //printf("%lld %lld\n", ans, cnt); return cnt; } long long count(vector <int> a, vector <int> b) { int i, n = a.size(); CL(mp, 0); CL(vis, false); for(i = 0; i < n; ++i) { mp[a[i]][b[i]] = 1; mp[b[i]][a[i]] = 1; } ans = 1; dfs(a[0]); return ans; } };