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;
    }
};

 

posted @ 2013-02-19 10:01  AC_Von  阅读(206)  评论(0编辑  收藏  举报