树上最优解+贪心+dfs+LA3902

来源:互联网 发布:300英雄血盟桐人淘宝 编辑:程序博客网 时间:2024/05/20 03:38

第一个dfs计算出叶结点的深度,第二个又来标记安放一个服务器后可以覆盖那些节点。

下面是代码:

#include<iostream>#include<vector>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int maxn=1010;int n,s,k,fa[maxn];vector<int> gr[maxn],nodes[maxn];bool cover[maxn];void dfs(int u,int f,int d){    fa[u]=f;    if(gr[u].size()==1&&d>k)    nodes[d].push_back(u);    for(int i=0;i<gr[u].size();i++)    {        int v=gr[u][i];        if(v!=f)        dfs(v,u,d+1);    }}void dfs2(int u,int f,int d){    cover[u]=true;    for(int i=0;i<gr[u].size();i++)    {        if(gr[u][i]!=f&&d<k)        dfs2(gr[u][i],u,d+1);    }}int solve(){    int ans=0;    memset(cover,0,sizeof(cover));    for(int d=n-1;d>k;d--)    {        for(int i=0;i<nodes[d].size();i++)        {            int u=nodes[d][i];            if(!cover[u])            {                int v=u;                for(int j=0;j<k;j++) v=fa[v];                dfs2(v,-1,0);                ans++;            }        }    }    return ans;}int main(){    #ifndef ONLINE_JUDGE        freopen("in.txt","r",stdin);    #endif    int t;    cin>>t;    while(t--)    {        cin>>n>>s>>k;        for(int i=1;i<=n;i++)        {            gr[i].clear();            nodes[i].clear();        }        for(int i=0;i<n-1;i++)        {            int a,b;            cin>>a>>b;            gr[a].push_back(b);            gr[b].push_back(a);        }        dfs(s,-1,0);        cout<<solve()<<endl;    }    return 0;}


0 0
原创粉丝点击