#include<bits/stdc++.h>
using namespace std;
#define int int64_t
#define pb push_back
const int N=1e6+2,mod=1e9+7;
vector<int>rg[N],cur;
int memo[N],vrx[N],vis[N];
int get(int u,int v){
cur.push_back(v);
if(u==v)return memo[v]=1;
if(memo[v]!=-1)return memo[v];
int sm=0;
for(int j:rg[v]){
if(!vis[j]||j==u)
sm=(sm+get(u,j))%mod;
}
return memo[v]=sm;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,m,p;
cin>>n>>m>>p;
for(int i=1;i<=p;++i)
cin>>vrx[i];
for(int i=0,u,v;i<m;++i){
cin>>u>>v;
rg[v].pb(u);
}
vrx[0]=1;
vrx[p+1]=n;
p+=2;
//neka je rg alternativni graf u kome je svaki vertex obrnut
//ako postoji ciklus u rg, trivijalno postoji u g, pa je rg aciklican
//dokazacemo da u rg ne sme da postoji put od vrx[i] do vrx[j] ako j>i
//pps. postoji put od vrx[i] do vrx[j] za j>i u rg
//pod pretpostavkom da postoji bar jedan put 1->n koji prolazi kroz sve vrx[i]
//postoji i put od vrx[i] do vrx[j] u g
//odnosno vrx[j] do vrx[i] u rg, odakle imamo ciklus u rg -> kontradikcija
//dakle u rg od vrx[i] postoje putevi samo do vrx[j<=i]
//t.d. od vrx[1] postoji put samo do vrx[0]
//ponovo, pod pretpostavkom da postoji brat 1 dobar put
//t.d. mogu da izracunam broj puteva od vrx[1] do vrx[0]
//neka je skup cvorova koje sam presao u putevima od vrx[i,<i] S
//uzmimo proizvoljno x iz S. neka sam ja sad na i+1
//neka sam na putu i+1 naisao na x.
//pretpostavimo da od i+1 mogu da dodjem do i u rg (to mi treba)
//a od nekog j<i sam dosao sa x do j-1
//znaci mogu imam: (x)->(j-1)->(i)->(i+1)->(x) te dobijam ciklus (kontradikcija)
//->mogu da pravim vizited nad ljudima koje sam obisao u x
//za svako i krenem dfs sa vizitedom nad rg iz vrx[i]
//O(n+m)
fill(memo,memo+N,-1);
int ans=1;
for(int i=1;i<p;++i){
cur.clear();
ans=(ans*get(vrx[i-1],vrx[i]))%mod;
for(auto&x:cur)
vis[x]=1;
}
cout<<ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |