➤ 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!!
