➤ Problem Link : 427C. Checkposts
✅ C++ Solution :
#include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD 1000000007 int n,m; ll cost[100005]; bool visited[100005]; vector<int> adj[100005]; vector<int> adj2[100005]; vector<int> seq; stack<int> q; ll ans1,ans2; ll cnt,mini; void dfs(int v) { for(int i=0;i<adj[v].size();i++) { if(!visited[adj[v][i]]) { visited[adj[v][i]]=1; dfs(adj[v][i]); } } q.push(v); seq.push_back(v); } void dfs2(int v) { if(cost[v]<mini) { mini=cost[v]; cnt=1; } else if(cost[v]==mini) cnt++; for(int i=0;i<adj2[v].size();i++) { if(!visited[adj2[v][i]]) { visited[adj2[v][i]]=1; dfs2(adj2[v][i]); } } } int main() { int u,v; cin>>n; for(int i=1;i<=n;i++) cin>>cost[i]; cin>>m; while(m--) { cin>>u>>v; adj[u].push_back(v); adj2[v].push_back(u); } memset(visited,0,sizeof(visited)); for(int i=1;i<=n;i++) { if(!visited[i]) { visited[i]=1; dfs(i); } } memset(visited,0,sizeof(visited)); int i=0; ans1=0,ans2=1; mini=LONG_MAX,cnt=0; while(!q.empty()) { ll val=q.top(); q.pop(); if(!visited[val]) { mini=LONG_MAX,cnt=0; visited[val]=1; dfs2(val); ans1+=mini; ans2=(ans2%MOD*cnt%MOD)%MOD; } } cout<<ans1<<" "<<ans2; }
Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook.
😇Happy Learning!!