树的最大独立集【刘汝佳刷表法

转载来自 https://blog.csdn.net/qq_26122039/article/details/50640649 

复杂度也是O(N^2),但是相较于上一篇blog的思路  感觉还是好想很多

不变的都是  :在构建树(dfs实现)的过程中顺便把答案也求出来了。

#include 
#include 
#include 
#include 

using namespace std;

#define maxn 100
vector v[maxn];
int d[maxn], s[maxn], gs[maxn];
int dfs(int n, int fa)
{
    for(int i = 0; i < v[n].size(); i++)
    {
        int m = v[n][i];
        if(m != fa)dfs(m, n);
        s[n] += d[m];
        if(fa != -1)
            gs[fa] += d[m];
    }
    d[n] = max(s[n], gs[n] + 1);
    return d[n];
}
int main()
{
   // freopen("in.txt", "r", stdin);
    int n;
    while(cin >> n)
    {
      for(int i = 0; i < n; i++)
          v[i].clear();
      for(int i = 0; i < n-1; i++)
      {
        int a, b;
        cin >> a >> b;;
        v[a].push_back(b);
        v[b].push_back(a);
      }
      memset(d, 0, sizeof(d));
      memset(s, 0, sizeof(s));
      memset(gs, 0, sizeof(gs));
      cout << dfs(1, -1) << endl;
    }
    return 0;
}

 

你可能感兴趣的:(oj)