Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //In the Name of Allah Most Gracious, Most Merciful//
- /*If you want something you've never had, you have to do something you never did.*/
- #include<bits/stdc++.h>
- using namespace std;
- #define pb push_back
- #define ll unsigned long long
- #define pii pair<int,int>
- #define pll pair<ll,ll>
- #define M 1000007
- #define INFL 1e18
- #define PI acos(-1)
- #define mp make_pair
- #define fast_in_out ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- //const int fx[]= {+1,-1,+0,+0};
- //const int fy[]= {+0,+0,+1,-1};
- //const int fx[]={+0,+0,+1,-1,-1,+1,-1,+1}; // Kings Move
- //const int fy[]={-1,+1,+0,+0,+1,+1,-1,-1}; // Kings Move
- //const int fx[]={-2, -2, -1, -1, 1, 1, 2, 2}; // Knights Move
- //const int fy[]={-1, 1, -2, 2, -2, 2, -1, 1}; // Knights Move
- bool visited[M];
- int finish_time[M];
- vector<int>adj[M],revAdj[M];
- vector<int>scc[M];
- int cost[M];
- vector<pii>v;
- vector<int>vv;
- int t=0;
- int MOD=1e9+7;
- void dfs1(int src)
- {
- visited[src]=true;
- for(int i=0;i<adj[src].size();i++)
- {
- int k=adj[src][i];
- if(visited[k]==false)
- {
- dfs1(k);
- }
- }
- finish_time[src]=++t;
- }
- void dfs2(int src,int p)
- {
- visited[src]=true;
- // cout<<src<<" "<<p<<endl;
- scc[p].pb(src);
- for(int i=0;i<revAdj[src].size();i++)
- {
- int k=revAdj[src][i];
- if(visited[k]==false)
- {
- dfs2(k,p);
- }
- }
- }
- int main()
- {
- fast_in_out;
- //freopen("input.txt","r",stdin);
- //freopen("output.txt","w",stdout);
- int n;
- cin>>n;
- for(int i=1;i<=n;i++)
- {
- cin>>cost[i];
- }
- int m;
- cin>>m;
- for(int i=0;i<m;i++)
- {
- int x,y;
- cin>>x>>y;
- adj[x].pb(y);
- revAdj[y].pb(x);
- }
- memset(visited,false,sizeof visited);
- for(int i=1;i<=n;i++)
- {
- if(visited[i]==false)
- {
- dfs1(i);
- }
- }
- for(int i=1;i<=n;i++)
- {
- v.pb(mp(finish_time[i],i));
- }
- sort(v.begin(),v.end());
- int num=1;
- memset(visited,false,sizeof visited);
- ll sum=0;
- ll total=1;
- for(int i=v.size()-1;i>=0;i--)
- {
- int k=v[i].second;
- if(visited[k]==false)
- {
- dfs2(k,num);
- num++;
- }
- }
- // for(int i=1;i<num;i++)
- // {
- // for(int j=0;j<scc[i].size();j++)
- // {
- // cout<<i<<" "<<scc[i][j]<<endl;
- // }
- // }
- int total_scc=num-1;
- cout<<total_scc<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment