[P3244][HNOI2015] 落忆枫音 (树上DAG+组合数)

本文探讨了在给定的有向无环图(DAG)中,通过添加一条边后生成树数量的计算方法。利用树上DAG概念与组合数原理,详细解析了如何通过动态规划计算额外生成树,并介绍了朱刘定理的应用。

题意:给一个DAG,然后多加一条边,求在这个图中有多少种不同的生成树;

解法:树上DAG+组合数;

1.树上DAG:因为在DAG上多加了一条边,所以原图会出现环,那么多算的答案就是 rel = ans / ( 环上的点的入度的累乘 ),最后的答案就是 ans-rel(要注意,多加了一条边后,图上可能不止一个环,此时的 rel就是∑tot,tot = ans / ( 环上的点的入度的累乘 ));我们可以在计算这个多算出来的贡献时使用 DP,而在 DP时可以在原图上进行,因为我们的结束边界是多加的那一条边的 end;

2.组合数:当图还是一个DAG时,由乘法原理可得 ans就是所有入度的乘积(这其实是一个定理——朱刘定理);

附上代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int N = 2e5+10;
const int mod = 1e9+7;

inline int read(){
    int ref=0,x=1;char ch=getchar();
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) ref=ref*10+ch-'0',ch=getchar();
    return ref*x;
}

int n,m,xx,yy;
struct edge{
    int next,to;
}a[N<<4];
int cnt,head[N<<4],x[N],y[N];
int ru[N],vis[N],f[N];
ll ans=1,sum=1;

void add(int u,int v){
    a[++cnt]=(edge){head[u],v};
    head[u]=cnt;
}

ll ksm(ll a,ll b){
    ll rel=1;
    a%=mod;
    while(b){
        if(b&1) rel=(rel*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return rel;
}

ll inv(ll a){ return ksm(a,mod-2); }

void dfs(int x){
    if(vis[x]) return ;
    vis[x]=1;
    if(x==yy){
        f[x]=(sum*inv(ru[x]))%mod;
        return ;
    }
    for(int i=head[x];i;i=a[i].next){
        int v=a[i].to;
        dfs(v);
        f[x]=(f[x]+f[v])%mod;//乘法具有分配律,不影响最终的答案 
    }
    f[x]=(f[x]*inv(ru[x]))%mod;
}

int main()
{
    n=read(),m=read(),xx=read(),yy=read();
    ru[1]++;
    for(int i=1;i<=m;++i){
        int x,y;
        x=read(),y=read();
        add(y,x);
        ru[y]++;
    }
    for(int i=1;i<=n;++i){
        if(i==yy) ans=(ans*(ru[i]+1))%mod;
        else ans=(ans*ru[i])%mod;
        sum=(sum*ru[i])%mod;
    }
    dfs(xx);
    if(xx==yy||yy==1) printf("%lld",sum%mod);
    else printf("%lld",(ans-f[xx]+mod)%mod);
    return 0;
}

 

转载于:https://www.cnblogs.com/nnezgy/p/11469152.html

数据集介绍:垃圾分类检测数据集 一、基础信息 数据集名称:垃圾分类检测数据集 图片数量: 训练集:2,817张图片 验证集:621张图片 测试集:317张图片 总计:3,755张图片 分类类别: - 金属:常见的金属垃圾材料。 - 纸板:纸板类垃圾,如包装盒等。 - 塑料:塑料类垃圾,如瓶子、容器等。 标注格式: YOLO格式,包含边界框和类别标签,适用于目标检测任务。 数据格式:图片来源于实际场景,格式为常见图像格式(如JPEG/PNG)。 二、适用场景 智能垃圾回收系统开发: 数据集支持目标检测任务,帮助构建能够自动识别和分类垃圾材料的AI模型,用于自动化废物分类和回收系统。 环境监测与废物管理: 集成至监控系统或机器人中,实时检测垃圾并分类,提升废物处理效率和环保水平。 学术研究与教育: 支持计算机视觉与环保领域的交叉研究,用于教学、实验和论文发表。 三、数据集优势 类别覆盖全面: 包含三种常见垃圾材料类别,覆盖日常生活中主要的可回收物类型,具有实际应用价值。 标注精准可靠: 采用YOLO标注格式,边界框定位精确,类别标签准确,便于模型直接训练和使用。 数据量适中合理: 训练集、验证集和测试集分布均衡,提供足够样本用于模型学习和评估。 任务适配性强: 标注兼容主流深度学习框架(如YOLO等),可直接用于目标检测任务,支持垃圾检测相关应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值