427C. Checkposts - Codeforces Solution C++

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