【BFS树】“范式杯”2023牛客暑期多校训练营1 K

K-Subdivision_“范式杯”2023牛客暑期多校训练营1 (nowcoder.com)

题意:

思路:

 

首先对1结点进行BFS,形成一棵BFS树

贡献由两部分组成

第一部分由BFS树的非树边组成

第二部分由树边组成

对于第一部分,对于一个结点和该结点相邻的非树边上产生的有效结点数最多为 K-dis[u]

该结点可能会有很多条非树边,因此要先统计该结点非树边的个数cnt

对于这个结点产生的所有非树边,产生的贡献为(K-dis[u])*cnt+1

最后的+1是算上它本身

对于第二部分,有一个结论就是,把结点加在叶子结点对应的边上最优

证明如下:

因此我们对每个叶子结点去算贡献

对于一个叶子结点,贡献也为(K-dis[u])*cnt+1

只不过对于叶子结点,有贡献的边至少为1,因此需要cnt=max(cnt,1)

样例解释:

其余的在代码中给出了解释:

#include <bits/stdc++.h>

#define int long long

using namespace std;

const int mxn=1e5+10;
const int mxe=1e5+10;

struct ty{
    int to,next;
}edge[mxe<<2];

int N,M,K,u,v;
int tot=0;
int head[mxn],dis[mxn],inner[mxn],pre[mxn];

void add(int u,int v){
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void G_init(){
    tot=0;
    for(int i=0;i<=N;i++){
        head[i]=-1;
    }
}
void bfs(){
    memset(dis,-1,sizeof(dis));
    queue<int> Q;
    Q.push(1);
    dis[1]=0;
    while(!Q.empty()){
        int u=Q.front();
        Q.pop();
        for(int i=head[u];~i;i=edge[i].next){
            if(dis[edge[i].to]==-1){
                dis[edge[i].to]=dis[u]+1;
                pre[edge[i].to]=u;//判断是否为非树边
                inner[u]=1;//标记是否是BFS树的叶子结点
                Q.push(edge[i].to);
            }
        }
    }
}
void solve(){
    cin>>N>>M>>K;
    G_init();
    for(int i=1;i<=M;i++){
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    bfs();//建立BFS树
    int ans=1;//算上1结点
    for(int u=2;u<=N;u++){
        if(dis[u]==-1||dis[u]>K) continue;//对于不在BFS树上的点,或者在树上离1结点太远的点,都没有贡献
        int cnt=0;
        for(int i=head[u];~i;i=edge[i].next){
            if(pre[edge[i].to]==u||pre[u]==edge[i].to) continue;//判断是否为非树边
            cnt++;//统计有效边,对于非树边那就是非树边的个数
        }
        if(!inner[u]) cnt=max(cnt,1ll);//如果为叶子结点,有效边至少为1,就是叶子结点对应的那条边
        ans+=(K-dis[u])*cnt+1;//计算贡献
    }
    cout<<ans<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    while(__--)solve();return 0;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多用户BFSK直接序列扩频(Direct Sequence Spread Spectrum, DSSS)是一种用于在高斯信道中传输多用户信息的调制技术。在高斯信道中,基带传输的多用户BFSK信号会受到噪声和多径衰落影响,而DSSS技术可以有效地降低这些干扰。该系统的基带模型和传输过程如下: 1. 基带模型:多用户BFSK直接序列扩频系统的基带模型由多个用户组成,每个用户通过BFSK调制产生自己的二进制码("+"和"-"),并通过PN码(伪随机码序列)进行直接序列扩频。每个用户的二进制码序列独立且相互正交,由此保证了不同用户之间的互相干扰最小化。 2. 传输过程:多用户BFSK直接序列扩频系统中,首先将每个用户的二进制码序列进行BFSK调制,例如用正弦信号表示“+”,用余弦信号表示“-”。然后,通过PN码对调制信号进行序列扩频,将二进制信息进行频率扩展。扩频后的信号再通过高斯信道进行传输,受到噪声和多径衰落的影响。接收端利用相应用户的PN码进行解扩频,得到扩展后的信号,并进行匹配滤波和判决,恢复出原始的二进制信息。 多用户BFSK直接序列扩频系统在高斯信道中具有如下特点: 1. 抗干扰性:DSSS技术通过序列扩频,使得信号在频率上分散,从而提高了抗噪声和多径干扰的能力。不同用户的扩频码序列正交,减小了用户之间的互相干扰。 2. 高容量:多用户BFSK直接序列扩频系统可以承载多个用户的信息传输,并且用户之间的频率带宽可以重叠。这种技术可以提高信道利用率,提供更大的信息传输容量。 3. 安全性:DSSS技术通过伪随机序列的扩频码进行信号扩展,在频谱上均匀分布,提高了系统的安全性和抗干扰性。除非知道正确的扩频码序列,否则非授权用户很难恢复原始信息,从而增强了系统的安全性。 总而言之,多用户BFSK直接序列扩频系统通过序列扩频和正交码设计,可以提高信道容量、抗干扰性和安全性,适用于高斯信道中多用户通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值