【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 100005 #define MAXM 200005 #define P 1000000007 int n, m, x, y, ans; int s[MAXM], t[MAXM], d[MAXN], f[MAXN]; long long inv[MAXN], value[MAXN]; bool visited[MAXN]; vector <int> a[MAXN]; void dp(int pos) { for (unsigned i = 0; i < a[pos].size(); i++) { value[a[pos][i]] += value[pos] * inv[a[pos][i]]; value[a[pos][i]] %= P; f[a[pos][i]]--; if (f[a[pos][i]] == 0) dp(a[pos][i]); } } void dfs(int pos) { if (visited[pos]) return; visited[pos] = true; for (unsigned i = 0; i < a[pos].size(); i++) dfs(a[pos][i]); } long long power(long long x, int y) { if (y == 0) return 1; long long tmp = power(x, y / 2); if (y % 2 == 0) return tmp * tmp % P; else return tmp * tmp % P * x % P; } int main() { scanf("%d%d%d%d", &n, &m, &x, &y); for (int i = 1; i <= m; i++) { scanf("%d%d", &s[i], &t[i]); a[s[i]].push_back(t[i]); } m++; s[m] = x; t[m] = y; for (int i = 1; i <= m; i++) d[t[i]]++; long long ans = 1; for (int i = 2; i <= n; i++) ans = ans * d[i] % P; for (int i = 2; i <= n; i++) inv[i] = power(d[i], P - 2); dfs(y); for (int i = 1; i <= m - 1; i++) if (visited[s[i]]) f[t[i]]++; value[y] = inv[y]; dp(y); ans = (ans - (value[x] * ans) % P + P) % P; printf("%lld\n", ans); return 0; }