Advertisement
Josif_tepe

Untitled

Mar 6th, 2023
960
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stack>
  4. #include <algorithm>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8. int m;  int n;
  9. bool visited[300005];
  10. stack<int>s;
  11. vector<int>graph[300005];
  12. vector<int>rev_graph[300005];
  13. void dfs(int node){
  14. visited[node]=true;
  15. for(int i=0; i<graph[node].size(); i++){
  16.  int sosed=graph[node][i];
  17.  if(visited[sosed]==false){
  18.     dfs(sosed);
  19. }
  20.  
  21. }
  22.     s.push(node);
  23. }
  24. vector<int> cycles;
  25. void rev_dfs(int r_node){
  26. visited[r_node]=true;
  27.     cycles.push_back(r_node);
  28. for(int i=0; i<rev_graph[r_node].size(); i++){
  29.  int rev_sosed=rev_graph[r_node][i];
  30.  if(visited[rev_sosed]==false){
  31.     rev_dfs(rev_sosed);
  32.  }
  33. }
  34. }
  35. int cost[300005];
  36. int main()
  37. {
  38.     cin>> n;
  39.     for(int i = 0; i < n; i++) {
  40.         cin >> cost[i];
  41.     }
  42.     cin >> m;
  43.         for(int i=0; i<m; i++){
  44.         int a, b;
  45.         cin>>a>>b;
  46.             a--;
  47.             b--;
  48.            
  49.         graph[b].push_back(a);
  50.         rev_graph[a].push_back(b);
  51.     }
  52.     memset(visited,  false, sizeof visited);
  53.  
  54.     for(int i=0; i<n; i++){
  55.         if(visited[i]==false){
  56.             dfs(i);
  57.         }
  58.     }
  59.     long long total_cost = 0, combs = 1;
  60.     long long MOD = 1e9 + 7;
  61.     memset(visited,false , sizeof visited);
  62.     while(!s.empty()){
  63.         int node=s.top();
  64.         if(visited[node]==false){
  65.             cycles.clear();
  66.             rev_dfs(node);
  67.             int min_cost = 2e9;
  68.             for(int i = 0; i < cycles.size(); i++) {
  69.                 min_cost = min(min_cost, cost[cycles[i]]);
  70.             }
  71.             total_cost += min_cost;
  72.             long long cnt = 0;
  73.             for(int i  =0; i < cycles.size(); i++) {
  74.                 if(min_cost == cost[cycles[i]]) {
  75.                     cnt++;
  76.                 }
  77.             }
  78.             combs *= cnt;
  79.             combs %= MOD;
  80.         }
  81.         s.pop();
  82.        
  83.     }
  84.    
  85.     cout << total_cost << " " << combs << endl;
  86.     return 0;
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement