4011: [HNOI2015]落忆枫音

4011: [HNOI2015]落忆枫音

链接

分析:

  原来是一个DAG,考虑如何构造树形图,显然可以给每个点找一个父节点,所以树形图的个数就是$prodlimits_u deg[u]$。

  那么加入一条边后,我们依然可以按照上面的公式求出一个值T,然后减去不合法的,即存在环的。

  那么这个环就是X->Y这条边,和Y->X的一条路径,X->Y必选了,所以可以考虑求出Y->X的一条路径,然后这条路径和X->Y构成的环的答案是$prodlimits_{u不是这条路径上的点} deg[u]$

  于是可以dag上dp求了。f[i]表示,确定了路径Y-i,$prodlimits_{u不是这条路径上的点} deg[u]$。

  初始化$f[Y] = T/deg[Y]$,然后转移方程$f[v] = frac{sum_{u->v}f[u]}{deg[v]}$。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<map>
#include<queue>
#include<vector>
using namespace std;
typedef long long LL;
 
inline int read() {
    int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
}
 
const int N = 200005, mod = 1e9 + 7;
struct Edge{ int to, nxt; } e[N << 1];
int head[N], deg[N], tdeg[N], q[N], inv[N], f[N], En;
 
int ksm(int a,int b) {
    int res = 1;
    while (b) {
        if (b & 1) res = 1ll * res * a % mod;
        a = 1ll * a * a % mod;
        b >>= 1;
    }
    return res;
}
inline void add_edge(int u,int v) {
    ++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En; deg[v] ++; tdeg[v] ++;
}
int main () {
    int n = read(), m = read(), X = read(), Y = read(); tdeg[Y] ++;
    for (int i = 1; i <= m; ++i) {
        int x = read(), y = read();
        add_edge(x, y);
    }
    int ans = 1;
    for (int i = 2; i <= n; ++i) ans = 1ll * ans * tdeg[i] % mod;
    if (Y == 1) { cout << ans; return 0; }
    for (int i = 1; i <= m; ++i) inv[i] = ksm(i, mod - 2);
    int L = 1, R = 0;
    for (int i = 1; i <= n; ++i) if (deg[i] == 0) q[++R] = i;
    f[Y] = ans;
    while (L <= R) {
        int u = q[L ++];
        f[u] = 1ll * f[u] * inv[tdeg[u]] % mod;
        for (int i = head[u]; i; i = e[i].nxt) {
            int v = e[i].to;
            f[v] = (f[v] + f[u]) % mod;
            if (!(--deg[v])) q[++R] = v;
        }
    }
    cout << (ans - f[X] + mod) % mod;
    return 0;
}
原文地址:https://www.cnblogs.com/mjtcn/p/10355668.html