题面

传送门

思路

首先有一个结论(应该是有比较大的利用价值的):

有向无环图的生成外向树树个数等于所有入度非0的点的入度乘积

然后这道题里面,唯一不合拍的因素就是这里有一条可能成环的边

我们可以把这条边先加入原来的DAG里面,然后用上面的结论算出总生成树个数,再减去不合法的,得到答案

那么有哪些方案是不合法的呢?

显然,我们加入一条边形成了环的话,我们前面的计算会算上选择包含新加入的边的某个环的方案,而这个方案是不合法的

假设新加入的边是s->t,那么我们只要找到所有包含t->s的生成树,然后减掉,就得到了答案

具体而言,这里的操作方法,是在原来的DAG上面dp

$dp[t]$初始化为原来的答案,然后往$s$做拓扑序上的$dp$

转移方程是$dp[v]=\sum \frac{dp[u]}{in[u]}$,其中$in[u]$表示原图中的入度

显然只有能够在$t->s$路径上的点的$dp$值才有意义,而这里除掉度数表示的就是这里仅能选一条边

最后用原来答案减掉$dp[s]$即可

Code

```cpp

include

include

include

include

include

include

define ll long long

define MOD 1000000007

using namespace std;
inline int read(){
    int re=0,flag=1;char ch=getchar();
    while(ch>'9'||ch<'0'){
        if(ch=='-') flag=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
    return reflag;
}
int n,m,op,ed,first[100010],cnte;ll in[100010],inv[200010],re[100010];
struct edge{
    int to,next;
}a[200010];
inline void add(int u,int v){
    a[++cnte]=(edge){v,first[u]};first[u]=cnte;
}
ll ans=1,dp[100010];
int q[100010],head,tail;
void topo(){
    int i,u,v;head=tail=0;
    dp[ed]=ans;in[ed]--;
    for(i=1;i<=n;i++){
        if(!in[i]) q[tail++]=i;
        re[i]=in[i];
    }
    in[ed]++;
    while(head<tail){
        u=q[head++];dp[u]=dp[u]
inv[in[u]]%MOD;
        for(i=first[u];~i;i=a[i].next){
            v=a[i].to;re[v]--;
            dp[v]=(dp[v]+dp[u])%MOD;
            if(!re[v]) q[tail++]=v;
        }
    }
}
int main(){
    memset(first,-1,sizeof(first));
    n=read();m=read();op=read();ed=read();in[ed]++;
    int i,t1,t2;
    inv[1]=1;
    for(i=2;i<=m;i++) inv[i]=(MOD-MOD/i)inv[MOD%i]%MOD;
    for(i=1;i<=m;i++){
        t1=read();t2=read();
        add(t1,t2);in[t2]++;
    }
    for(i=2;i<=n;i++) ans=ans
in[i]%MOD;
    if(ed==1){
        printf("%lld\n",ans);return 0;
    }
    topo();
    printf("%lld\n",(ans-dp[op]+MOD)%MOD);
}

[HNOI2015][bzoj4011] 落叶枫音 [拓扑DP]的更多相关文章

  1. 【BZOJ4011】【HNOI2015】落忆枫音(动态规划)

    [BZOJ4011][HNOI2015]落忆枫音(动态规划) 题面 BZOJ 洛谷 Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜 ...

  2. codeforces 721C (拓扑+dp)

    题意就是某个人去游览,起点是1点,终点是n点,他总的游览时间不能超过t,第一行给你3个数字,点的个数n,边的个数m,时间t,然后底下m行数据,每行代表一条边,边的起点,终点和权值(走过去花的时间),然 ...

  3. 【BZOJ4010】【HNOI2015】菜肴制作(拓扑排序)

    [BZOJ4010][HNOI2015]菜肴制作(拓扑排序) 题面 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...

  4. 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)

    LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...

  5. luogu2149 Elaxia的路线 (dijkstra+拓扑dp)

    先标记上一个人所有最短路上的边(同时也要标记反向边) 然后拿着另一个人最短路上的边(会构成一个DAG)去做拓扑dp,记从原点到某个点的最大的某个路径的被标记的边的个数 #include<bits ...

  6. UVA 11324.The Largest Clique tarjan缩点+拓扑dp

    题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...

  7. Codeforces Round #374 (Div. 2) A , B , C 水,水,拓扑dp

    A. One-dimensional Japanese Crossword time limit per test 1 second memory limit per test 256 megabyt ...

  8. bzoj4011 [HNOI2015]落忆枫音 拓扑排序+DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4011 题解 首先考虑如果没有那么一条被新加进来的奇怪的边的做法. 我们只需要给每一个点挑一个父 ...

  9. [BZOJ4011][HNOI2015] 落忆枫音(学习笔记) - 拓扑+DP

    其实就是贴一下防止自己忘了,毕竟看了题解才做出来 Orz PoPoQQQ 原文链接 Description 背景太长了 给定一个DAG,和一对点(x, y), 在DAG中由x到y连一条有向边,求生成树 ...

随机推荐

  1. Vscode插件--微信小程序格式化以及高亮组件wxml-vscode

    wxml-vscode wxml-vscode 仓库 提问题 安装 通过 F1 或者 CMD + Shift + P 输入 install. 选择: Install Extension. 特性 格式化 ...

  2. hdu_1452_Happy 2004 (乘法逆元

    Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your ...

  3. .Net Core爬虫爬取妹子网图片

    现在网上大把的Python的爬虫教程,很少看见有用C#写的,正好新出的.Net Core可以很方便的部署到Linux上,就用妹子图做示范写个小爬虫 在C#下有个很方便的类库 HtmlAgilityPa ...

  4. JQuery制作网页—— 第四章JavaScript对象及初识面向对象

    1.对象:在JavaScript中,所有事物都是对象,如字符串.数值.数组.函数等. JavaScript中的基本数据类型: number(数值类型)   string(字符串类型)  boolean ...

  5. echarts零基础快速入门

    第一步:得到这个dom对象.然后进行各种操作. var myChart = echarts.init(document.getElementById('item1')); 第二步:所有的配置项全部放在 ...

  6. 根据html页面模板动态生成html页面(c#类)

    本文转载自:http://www.cnblogs.com/yuanbao/archive/2008/01/06/1027985.html点击打开链接 一直以为动态生成静态页面不好做,昨天在网上找了下, ...

  7. php生成微信小程序二维码源码

    目前有3个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口.第一步:获取   access_token public function getWxAccessToken(){ $appid ...

  8. java 二进制、位运算、和移位运算符(2013-07-30-bd 写的日志迁移

    二进制是逢2进位的进位制,0.1是基本算符, 1字节=8位 比如 int a =1 ;int 占4个字节在计算机里表示为: java中的4个位运算,分别是“按位与&.按位或|.按位异或^,按位 ...

  9. is 和 == 的区别,utf和gbk的转换,join用法

    is 和 == 的区别 # is 比较的是内存地址 # == 比较的是值 a = 'alex' b = 'alex' #int,str(小数据池)会被缓存,为了节约内存 print(id(a),id( ...

  10. Java集合——LinkedHashMap源码详解

    个KV.LinkedHashMap不仅像HashMap那样对其进行基于哈希表和单链表的Entry数组+ next链表的存储方式,而且还结合了LinkedList的优点,为每个Entry节点增加了前驱和 ...