Advertisement
libobil

Untitled

Dec 21st, 2022
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define MAXN 2007
  3. #define MAXM 100007
  4. using namespace std;
  5.  
  6. const long long mod=1e9+7;
  7.  
  8. struct edge{
  9. int to;
  10. int id;
  11. };
  12.  
  13. int n,m,q,a[MAXM],b[MAXM],u,w,banned,pt;
  14. long long answer;
  15.  
  16. vector< edge > v[MAXN],r[MAXN];
  17.  
  18. int li[MAXN],tim,comp[MAXN],k,low[MAXN],dep[MAXN];
  19. pair< vector<int> , int > components[MAXN];
  20. int differ[MAXN][MAXN];
  21. bool possible[MAXM],in[MAXN];
  22.  
  23. stack<int> st;
  24. vector<int> poss;
  25.  
  26. void tarjan(int x,int p){
  27. pt++; low[x]=dep[x]=pt;
  28. li[x]=tim;
  29. st.push(x); in[x]=true;
  30.  
  31. for(int i=0;i<v[x].size();i++){
  32. if(v[x][i].id==banned)continue;
  33.  
  34. if(li[v[x][i].to]==tim and in[v[x][i].to]){
  35. low[x]=min(low[x],dep[v[x][i].to]);
  36. }else if(li[v[x][i].to]!=tim){
  37. tarjan(v[x][i].to,x);
  38. low[x]=min(low[x],low[v[x][i].to]);
  39. }
  40. }
  41.  
  42. if(low[x]==dep[x]){
  43. k++;
  44. while(!st.empty() and st.top()!=x){
  45. comp[st.top()]=k; in[st.top()]=false; st.pop();
  46. }
  47. comp[x]=k; in[x]=false; st.pop();
  48. }
  49. }
  50.  
  51. void dfsin(int x){
  52. li[x]=tim;
  53. for(int i=0;i<r[x].size();i++){
  54. if(comp[r[x][i].to]==comp[x] and li[r[x][i].to]!=tim){
  55. dfsin(r[x][i].to);
  56. possible[r[x][i].id]=true;
  57. }
  58. }
  59. }
  60.  
  61. void dfsout(int x){
  62. li[x]=tim;
  63. for(int i=0;i<v[x].size();i++){
  64. if(comp[v[x][i].to]==comp[x] and li[v[x][i].to]!=tim){
  65. dfsout(v[x][i].to);
  66. possible[v[x][i].id]=true;
  67. }
  68. }
  69. }
  70.  
  71. void findscc(){
  72. k=0; tim++;
  73. tarjan(0,0);
  74. }
  75.  
  76. void spanning_scc(){
  77. tim++;
  78. for(int i=1;i<=n;i++){
  79. if(li[i]!=tim)dfsin(i);
  80. }
  81. tim++;
  82. for(int i=1;i<=n;i++){
  83. if(li[i]!=tim)dfsout(i);
  84. }
  85. }
  86.  
  87. void add(long long x){
  88. answer*=200000; answer+=x; answer%=mod;
  89. }
  90.  
  91. int main(){
  92.  
  93. ios_base::sync_with_stdio(0);
  94. cin.tie(0);
  95. cout.tie(0);
  96.  
  97. cin>>n>>m;
  98. for(int i=1;i<=n;i++){
  99. v[0].push_back({i,-1});
  100. }
  101. for(int i=1;i<=m;i++){
  102. cin>>a[i]>>b[i];
  103. v[a[i]].push_back({b[i],i});
  104. r[b[i]].push_back({a[i],i});
  105. }
  106.  
  107. findscc();
  108. spanning_scc();
  109.  
  110. for(int i=1;i<=m;i++){
  111. if(possible[i])poss.push_back(i);
  112. }
  113.  
  114. for(int i=0;i<poss.size();i++){
  115. banned=poss[i];
  116. findscc();
  117.  
  118. for(int f=1;f<=n;f++){
  119. components[f].first.push_back(comp[f]);
  120. components[f].second=f;
  121. }
  122. }
  123.  
  124. banned=0;
  125. findscc();
  126.  
  127. sort(components+1,components+n+1);
  128.  
  129. for(int i=1;i<=n;i++){
  130. pt=0;
  131. for(int f=1;f<i;f++){
  132. while(pt<poss.size() and components[f].first[pt]==components[i].first[pt])pt++;
  133. differ[components[i].second][components[f].second]=pt;
  134. }
  135. pt=0;
  136. for(int f=n;f>i;f--){
  137. while(pt<poss.size() and components[f].first[pt]==components[i].first[pt])pt++;
  138. differ[components[i].second][components[f].second]=pt;
  139. }
  140. differ[i][i]=poss.size();
  141. }
  142.  
  143. cin>>q;
  144. if(q>0){
  145. for(int i=1;i<=q;i++){
  146. cin>>u>>w;
  147. if(comp[u]!=comp[w]){
  148. add(0);
  149. }else{
  150. pt=differ[u][w];
  151. if(pt==int(poss.size())){
  152. add(m+1);
  153. }else{
  154. add(poss[pt]);
  155. }
  156. }
  157. }
  158. }else{
  159. for(u=1;u<=n;u++){
  160. for(w=u;w<=n;w++){
  161. if(comp[u]!=comp[w]){
  162. add(0);
  163. }else{
  164. pt=differ[u][w];
  165. if(pt==int(poss.size())){
  166. add(m+1);
  167. }else{
  168. add(poss[pt]);
  169. }
  170. }
  171. }
  172. }
  173. }
  174.  
  175. cout<<answer<<"\n";
  176.  
  177. return 0;
  178. }
  179.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement