BZOJ 4011 HNOI2015 落忆枫音 拓扑序DP

题目大意:给定一张有向无环图,现在要求加入一条边,求加入后以1为根的树形图个数

首先不考虑加入的这条边,那么这个图是一个DAG

由朱刘算法的推论可知,如果除根节点外每个点都选择一条入边,由于没有环,因此一定会形成一个树形图

因此答案就是∏ni=2degreei 其中degreei表示第i个点的入度

现在加入这条边之后,我们仍然可以套用这个公式,但是这样就会有一些不合法的方案被统计进来,我们需要把这些不合法的方案减掉

一个方案如果不合法,那么一定会形成一个环,而环一定包含新加入的那条边

因此我们减掉的方案其实是:

∑S是原图中y→x的一条路径的点集∏2≤j≤n,j?Sdegreej

然后我们就可以DP了

令fi表示∑S是原图中y→i的一条路径的点集∏2≤j≤n,j?Sdegreej

那么有动规方程

fi=∑j→ifjdegreei

初值

fy=∏ni=2degreeidegreey

注意y=1时要特判= =

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 200200
#define MOD 1000000007
using namespace std;
struct abcd{
    int to,next;
}table[M];
int head[M],tot;
int n,m,s,t;
int degree[M],_degree[M];
long long inv[M],f[M],ans=1;
void Add(int x,int y)
{
    table[++tot].to=y;
    table[tot].next=head[x];
    head[x]=tot;
}
void Linear_Shaker()
{
    int i;
    for(inv[1]=1,i=2;i<=m+1;i++)
        inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
}
void Topology_Sort()
{
    static int q[M];
    int i,r=0,h=0;
    f[t]=ans;
    for(i=1;i<=n;i++)
        if(!degree[i])
            q[++r]=i;
    while(r!=h)
    {
        int x=q[++h];
        (f[x]*=inv[_degree[x]])%=MOD;
        for(i=head[x];i;i=table[i].next)
        {
            (f[table[i].to]+=f[x])%=MOD;
            if(!--degree[table[i].to])
                q[++r]=table[i].to;
        }
    }
}
int main()
{
    int i,x,y;
    cin>>n>>m>>s>>t;
    Linear_Shaker();
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        Add(x,y);
        degree[y]++;
        _degree[y]++;
    }
    _degree[t]++;
    for(i=2;i<=n;i++)
        (ans*=_degree[i])%=MOD;
    if(t==1)
    {
        cout<<ans<<endl;
        return 0;
    }
    Topology_Sort();
    cout<<(ans-f[s]+MOD)%MOD<<endl;
    return 0;
}
时间: 2024-08-06 01:58:27

BZOJ 4011 HNOI2015 落忆枫音 拓扑序DP的相关文章

BZOJ 4011: [HNOI2015]落忆枫音( dp )

DAG上有个环, 先按DAG计数(所有节点入度的乘积), 然后再减去按拓扑序dp求出的不合法方案数(形成环的方案数). -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long l

BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(连通),点1的入度为0.现在加一条原图没有的边,问有多少种方案可使这张图变成一棵以1为根的有向树(即每个点的父亲指向自己). N<=100000,M<=min(200000,N(N-1)/2). 实际上这个题主要在分析(感觉终于开始自己做出省选题了). 先看没有加边的情况,yy一下你发现这种情况的答案就是所有rd(入度)不为0的点rd相乘.道理是只

【BZOJ 4011】 [HNOI2015]落忆枫音

4011: [HNOI2015]落忆枫音 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 244 Solved: 137 [Submit][Status][Discuss] Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也不可能再见 到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑.

BZOJ4011 [HNOI2015]落忆枫音

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也不可能再见 到你姐姐吧.」 恒逸给出了一个略微无厘头的回

[HNOI2015] 落忆枫音

题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再见到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑. 「那你仔细观察过枫叶吗?」 说罢,枫茜伸手,接住了一片飘落的枫叶. 「其实每一片枫叶都是有灵魂的.你看,枫叶上不是有这么多脉络吗?我听说,枫叶上有一些特殊的位置,就和人的穴位一样.脉络都是连接在这些穴位之间的.枫树的灵魂流过每片枫叶

luogu3244 bzoj4011 HNOI2015 落忆枫音

这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入度,现在新加入一条不重复的边,使得它可能有环.求它的生成子图个数,使得子图正好包含N-1条边且1号点与其它的所有点连通. 题目分析: 我们首先要发现这是一个树的结构!有向的树. 分析树的特点,树的父亲只有一个,我们不妨从这里入手. 在这一个生成子图中,谁是谁的父亲? 我们知道1号点一定是root,这

【BZOJ】【4011】【HNOI2015】落忆枫音

拓扑排序+DP 题解:http://blog.csdn.net/PoPoQQQ/article/details/45194103 http://www.cnblogs.com/mmlz/p/4448742.html 通过转化……路径外的$degree_i$的乘积转化成所有点的degree之积除以路径内的,所以用到逆元…… PoPoQQQ的线性筛逆元好神奇啊……>_< OrzOrz 1 /******************************************************

【bzoj4011 hnoi2015】落忆枫音

题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再见到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑. 「那你仔细观察过枫叶吗?」 说罢,枫茜伸手,接住了一片飘落的枫叶. 「其实每一片枫叶都是有灵魂的.你看,枫叶上不是有这么多脉络吗?我听说,枫叶上有一些特殊的位置,就和人的穴位一样.脉络都是连接在这些穴位之间的.枫树的灵魂流过每片枫叶

[HNOI 2015]落忆枫音

Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也不可能再见 到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑. 「那你仔细观察过枫叶吗?」 说罢,枫茜伸手,接住了一片飘落的枫叶. 「其实每一片枫叶都是有灵魂的.你看,枫叶上不是有这么多脉络吗?我听说, 枫叶上有一些特殊的位置,就和人的穴位一样.脉络都是连接在这些穴位之间的. 枫树的灵