您的位置:首页 > 其它

SRM 570 div2

2013-02-19 10:01 246 查看
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: