Network

Posted nldqy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Network相关的知识,希望对你有一定的参考价值。

题目链接:Click here

Solution:

题目只要求覆盖叶子节点,那么我们先找到所有没被覆盖的叶子节点

我们把叶子节点按照到服务端的距离从大到小排序,然后贪心的找到它向上第k个祖先即可(因为先覆盖较小的显然不会覆盖到较大的,而先覆盖较大的却有可能覆盖较小的)

Solution:

#include<iostream>
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e3+11;
int n,rt,k,cnt,tot,ans;
int head[N],fa[N],de[N],p[N],dep[N];
struct Edgeint nxt,to;edge[N<<1];
inline bool cmp(int x,int y)return dep[x]>dep[y];
void ins(int x,int y)
    edge[++cnt].nxt=head[x];
    edge[cnt].to=y;head[x]=cnt;

void dfs(int x,int fat)
    for(int i=head[x];i;i=edge[i].nxt)
        int y=edge[i].to;
        if(y==fat) continue;
        dep[y]=dep[x]+1;
        fa[y]=x;dfs(y,x);
    

void change(int x,int fat)
    if(dep[x]==k) return ;
    for(int i=head[x];i;i=edge[i].nxt)
        int y=edge[i].to;
        if(y==fat) continue;
        if(dep[y]>dep[x]+1)
            dep[y]=dep[x]+1,change(y,x);
    

void solve()
    for(int i=1;i<=n;i++)
        if(de[i]==1&&dep[i]>k) p[++tot]=i;
    sort(p+1,p+n+1,cmp);
    for(int i=1;i<=tot;i++)
        if(dep[p[i]]>k)
            int x=p[i],y=k;
            while(y--) x=fa[x];
            dep[x]=0;change(x,0);++ans;
        
    printf("%d\n",ans);

int read()
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch))if(ch=='-')f=-f;ch=getchar();
    while(isdigit(ch))x=x*10+ch-48;ch=getchar();
    return x*f;

signed main()
    int t=read();
    while(t--)ans=tot=cnt=0;
        memset(head,0,sizeof(head));
        memset(dep,0,sizeof(dep));
        memset(de,0,sizeof(de));
        memset(fa,0,sizeof(fa));
        n=read(),rt=read(),k=read();
        for(int i=1;i<n;i++)
            int x=read(),y=read();
            ins(x,y),ins(y,x);
            de[x]++,de[y]++;
        dfs(rt,0);solve();
    return 0;

以上是关于Network的主要内容,如果未能解决你的问题,请参考以下文章

ospf-基础配置

SaltStack常用的模块

SaltStack常用的模块

SaltStack常用的模块

SaltStack常用的模块

关于简单动态路由协议配置,注入,路由重分布