Submission #1134717

#TimeUsernameProblemLanguageResultExecution timeMemory
1134717bpptidpShell (info1cup18_shell)C++20
100 / 100
219 ms54536 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...