제출 #1134717

#제출 시각아이디문제언어결과실행 시간메모리
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...