详见黄学长博客,一开始不会,然后看完题解就会了。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std ;
const int maxn=100010;
const int mod=1e9+7;
int n,m,x,y;
long long ans=1;
typedef struct NODE{
int to,next;
NODE (){
to=next=0;
}
NODE (int a,int b){
to=a,next=b;
}
}N;
N edge[2*maxn];
int cnt;
int last[maxn],dist[maxn],b[maxn];
long long f[maxn],ine[2*maxn];
vector <int> st;
void E_insert (int u,int v){
edge[++cnt]=(NODE) {v,last[u]};
last[u]=cnt;
}
void init (){
scanf ("%d %d %d %d",&n,&m,&x,&y);
int i,j,k;
for (i=1;i<=m;i++){
scanf ("%d %d",&j,&k);
E_insert (j,k);
dist[k]++;
}
}
void dp (){
f[y]=ans;
int i;
int now;
for (i=1;i<=n;i++){
if (!dist[i]) st.push_back (i);
}
while (!st.empty ()){
now=st.back ();
st.pop_back ();
f[now]=f[now]*ine[b[now]]%mod;
for (i=last[now];i;i=edge[i].next){
f[edge[i].to]=(f[edge[i].to]+f[now])%mod;
dist[edge[i].to]--;
if (!dist[edge[i].to]) st.push_back (edge[i].to);
}
}
}
int main (){
init ();
int i;
ine[1]=1;
for (i=2;i<=m+1;i++){
ine[i]=(-ine[mod%i]*(mod/i)%mod+mod)%mod;
}
dist[y]++;
for (i=1;i<=n;i++) b[i]=dist[i];
for (i=2;i<=n;i++) ans=ans*dist[i]%mod;
dist[y]--;
if (y==1) {
cout <<ans;
return 0;
}
dp ();
ans=(ans-f[x]+mod)%mod;
cout <<ans;
return 0;
}