Uva 网络(Network,Seoul 2007,LA 3902)

 1 #include<iostream>
 2 #include<cstring>
 3 #include<vector>
 4 using namespace std;
 5 
 6 const int maxn=1000+10;
 7 int n,s,k;
 8 vector<int> tree[maxn],nodes[maxn];
 9 int fa[maxn];
10 bool covered[maxn];
11 
12 void dfs(int u,int f,int d)
13 {
14     fa[u]=f;
15     int nc=tree[u].size();
16     if(nc==1&&d>k) nodes[d].push_back(u);
17     for(int i=0;i<nc;i++)
18         if(tree[u][i]!=f) dfs(tree[u][i],u,d+1);
19 }
20 
21 void dfs2(int u,int f,int d)
22 {
23     int nc=tree[u].size();
24     covered[u]=true;
25     for(int i=0;i<nc;i++)
26         if(tree[u][i]!=f&&d<k)
27             dfs2(tree[u][i],u,d+1);
28 }
29 
30 int solve()
31 {
32     int ans=0;
33     memset(covered,0,sizeof(covered));
34     for(int d=n-1;d>k;d--)
35         for(int i=0;i<nodes[d].size();i++)
36         {
37             int u=nodes[d][i];
38             if(covered[u]) continue;
39             int v=u;
40             for(int j=0;j<k;j++) v=fa[v];
41             dfs2(v,-1,0);
42             ans++;
43         }
44     return ans;
45 }
46 
47 int main()
48 {
49     int T;
50     cin>>T;
51     while(T--)
52     {
53         cin>>n>>s>>k;
54         for(int i=1;i<=n;i++)
55         {
56             tree[i].clear();
57             nodes[i].clear();
58         }
59         for(int i=1;i<=n-1;i++)
60         {
61             int a,b;
62             cin>>a>>b;
63             tree[a].push_back(b);
64             tree[b].push_back(a);
65         }
66         dfs(s,-1,0);
67         cout<<solve()<<endl;
68     }
69     return 0;
70 }
原文地址:https://www.cnblogs.com/InWILL/p/5582476.html